From 17c9deb115cd216aa2c6a6f625327c7ac9dfb83a Mon Sep 17 00:00:00 2001 From: Quentin Schulz Date: Tue, 7 Apr 2026 19:37:10 +0200 Subject: [PATCH] utils/generate-cyclonedx: hint at missing Buildroot host package on a specific error Since last commit, utils/generate-cyclonedx can now be used with Buildroot host tools, provided the user either externally install the SPDX schema in the DL_DIR themselves or have BR2_PACKAGE_HOST_PYTHON3_SSL and BR2_PACKAGE_HOST_CA_CERTIFICATES both enabled. If the latter is missing, Python will complain with: Traceback (most recent call last): File "/buildroot/build/host/lib/python3.14/urllib/request.py", line 1321, in do_open h.request(req.get_method(), req.selector, req.data, headers, ~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ encode_chunked=req.has_header('Transfer-encoding')) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/buildroot/build/host/lib/python3.14/http/client.py", line 1358, in request self._send_request(method, url, body, headers, encode_chunked) ~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/buildroot/build/host/lib/python3.14/http/client.py", line 1404, in _send_request self.endheaders(body, encode_chunked=encode_chunked) ~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/buildroot/build/host/lib/python3.14/http/client.py", line 1353, in endheaders self._send_output(message_body, encode_chunked=encode_chunked) ~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/buildroot/build/host/lib/python3.14/http/client.py", line 1113, in _send_output self.send(msg) ~~~~~~~~~^^^^^ File "/buildroot/build/host/lib/python3.14/http/client.py", line 1057, in send self.connect() ~~~~~~~~~~~~^^ File "/buildroot/build/host/lib/python3.14/http/client.py", line 1499, in connect self.sock = self._context.wrap_socket(self.sock, ~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^ server_hostname=server_hostname) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/buildroot/build/host/lib/python3.14/ssl.py", line 455, in wrap_socket return self.sslsocket_class._create( ~~~~~~~~~~~~~~~~~~~~~~~~~~~~^ sock=sock, ^^^^^^^^^^ ...<5 lines>... session=session ^^^^^^^^^^^^^^^ ) ^ File "/buildroot/build/host/lib/python3.14/ssl.py", line 1076, in _create self.do_handshake() ~~~~~~~~~~~~~~~~~^^ File "/buildroot/build/host/lib/python3.14/ssl.py", line 1372, in do_handshake self._sslobj.do_handshake() ~~~~~~~~~~~~~~~~~~~~~~~~~^^ ssl.SSLCertVerificationError: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate (_ssl.c:1081) During handling of the above exception, another exception occurred: Traceback (most recent call last): File "/buildroot/utils/generate-cyclonedx", line 53, in urllib.request.urlretrieve(SPDX_SCHEMA_URL, SPDX_SCHEMA_PATH) ~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/buildroot/build/host/lib/python3.14/urllib/request.py", line 212, in urlretrieve with contextlib.closing(urlopen(url, data)) as fp: ~~~~~~~^^^^^^^^^^^ File "/buildroot/build/host/lib/python3.14/urllib/request.py", line 187, in urlopen return opener.open(url, data, timeout) ~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^ File "/buildroot/build/host/lib/python3.14/urllib/request.py", line 487, in open response = self._open(req, data) File "/buildroot/build/host/lib/python3.14/urllib/request.py", line 504, in _open result = self._call_chain(self.handle_open, protocol, protocol + '_open', req) File "/buildroot/build/host/lib/python3.14/urllib/request.py", line 464, in _call_chain result = func(*args) File "/buildroot/build/host/lib/python3.14/urllib/request.py", line 1369, in https_open return self.do_open(http.client.HTTPSConnection, req, ~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ context=self._context) ^^^^^^^^^^^^^^^^^^^^^^ File "/buildroot/build/host/lib/python3.14/urllib/request.py", line 1324, in do_open raise URLError(err) urllib.error.URLError: Provide some hint as to what could be missing from Buildroot host. Signed-off-by: Quentin Schulz Signed-off-by: Arnout Vandecappelle --- utils/generate-cyclonedx | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/utils/generate-cyclonedx b/utils/generate-cyclonedx index 7cfeefbc5b..11edc05d80 100755 --- a/utils/generate-cyclonedx +++ b/utils/generate-cyclonedx @@ -52,7 +52,12 @@ if not SPDX_SCHEMA_PATH.exists(): # Download the CycloneDX SPDX schema JSON, and cache it locally cyclonedxpath.mkdir(parents=True, exist_ok=True) - urllib.request.urlretrieve(SPDX_SCHEMA_URL, SPDX_SCHEMA_PATH) + try: + urllib.request.urlretrieve(SPDX_SCHEMA_URL, SPDX_SCHEMA_PATH) + except urllib.error.URLError as e: + if "CERTIFICATE_VERIFY_FAILED" in str(e.reason): + raise Exception("Couldn't verify certificate. Try enabling BR2_PACKAGE_HOST_CA_CERTIFICATES.") + raise e try: with SPDX_SCHEMA_PATH.open() as f: