在我们为客户管理的服务器上,任何应用程序都无法访问某些 HTTPS URL,例如:
$ wget https://open-data.bielefeld.de/sites/default/files/alters_und_geschlechtsstruktur_ende2011bismitte2022.csv
--2022-12-21 15:59:58-- https://open-data.bielefeld.de/sites/default/files/alters_und_geschlechtsstruktur_ende2011bismitte2022.csv
Resolving open-data.bielefeld.de (open-data.bielefeld.de)... 194.8.223.72
Connecting to open-data.bielefeld.de (open-data.bielefeld.de)|194.8.223.72|:443... connected.
ERROR: cannot verify open-data.bielefeld.de's certificate, issued by ‘CN=Sectigo RSA Domain Validation Secure Server CA,O=Sectigo Limited,L=Salford,ST=Greater Manchester,C=GB’:
Unable to locally verify the issuer's authority.
To connect to open-data.bielefeld.de insecurely, use `--no-check-certificate'.
多个程序(包括 R 和 Python 脚本)都存在此问题,但我可以从桌面浏览器正常访问 URL。我假设根证书或证书链存在问题。服务器正在运行 Ubuntu 20.04 LTS,所有软件包都是最新的。什么可能导致此问题,我是否有办法(安全且简单地)修复它?
答案1
确实缺少证书,不是根证书,而是中间证书。HTTPS 服务器应该将链中的所有证书(根证书除外)与其响应一起发送,但有些服务器却没有这样做。Web 浏览器可以使用一种称为 AIA(授权信息访问)追踪* 的技术来应对这种情况,但许多其他客户端并未实施此技术。
正如 Steffen Ulrich 在他的评论中提到的,您可以找到丢失的证书并将其安装在您的系统上。
首先获取证书。您可以通过访问以下网站手动获取证书:SSL实验室,并在 Google 上搜索丢失证书的指纹。证书应为 PEM 格式(使用 BEGIN 和 END CERTIFICATE 进行 base64 编码)。我还编写了一个脚本来通过 AIA 获取证书,后来我意识到可以手动执行此操作:https://github.com/jdmansour/fetch-intermediate-certs
然后,要在 Ubuntu/Debian 上导入证书,请将其放入/usr/share/ca-certificates/extra
(如有必要,请创建目录)并运行sudo dpkg-reconfigure ca-certificates
。它会询问您是否应该在系统更新时信任新证书 - 选择您喜欢的任何选项,我认为“是”是默认选项。在下一个屏幕中,您可以启用新证书。大多数使用 OpenSSL 的工具应该会立即接受它。
*) 据我所知,Firefox 没有实现 AIA,但它也可以在那里工作。