![curl:(60)SSL 证书:无法获取本地颁发者证书 - ubuntu](https://linux22.com/image/764706/curl%EF%BC%9A%EF%BC%8860%EF%BC%89SSL%20%E8%AF%81%E4%B9%A6%EF%BC%9A%E6%97%A0%E6%B3%95%E8%8E%B7%E5%8F%96%E6%9C%AC%E5%9C%B0%E9%A2%81%E5%8F%91%E8%80%85%E8%AF%81%E4%B9%A6%20-%20ubuntu.png)
我们运行以下软件版本:
- Ubuntu 18.04.5
- Apache 2.4.29
- curl 7.58.0
我们运行一个教育应用程序,其中有许多 API 可以将文件上传到第三方网站https://api.turnitinuk.com来自我们的网络服务器https://nclhe-moodle.ncl-coll.ac.uk。
我们于 2020 年 12 月在网络服务器上成功更新了 nclhe-moodle.ncl-coll.ac.uk 的 SSL 证书,并且一切都按照我们预期的方式进行,但突然在 2021 年 2 月,我们开始收到以下错误,并且上传失败。
curl: (60) SSL certificate : unable to get local issuer certificate
(我不明白本地颁发者证书是什么,是客户端(网络服务器)还是服务器)
不知道为什么,它是在 2021 年 2 月才开始的,而证书是在 2020 年 12 月更新的。
如果我绕过代理服务器上的 IPS 证书检查,我们的 API 就可以成功运行。
以下是我迄今为止为解决此问题所尝试的方法:
在网络服务器上运行此命令:
curl -vs https://api.turnitinuk.com
以下错误:
* Rebuilt URL to: https://api.turnitinuk.com/ * Trying 199.47.86.35... * TCP_NODELAY set * Connected to api.turnitinuk.com (199.47.86.35) port 443 (#0) * ALPN, offering h2 * ALPN, offering http/1.1 * successfully set certificate verify locations: * CAfile: /etc/ssl/certs/ca-certificates.crt CApath: /etc/ssl/certs * TLSv1.3 (OUT), TLS handshake, Client hello (1): * TLSv1.3 (IN), TLS handshake, Server hello (2): * TLSv1.2 (IN), TLS handshake, Certificate (11): * TLSv1.2 (OUT), TLS alert, Server hello (2): * SSL certificate problem: unable to get local issuer certificate * stopped the pause stream! * Closing connection 0
运行以下 OpenSSL 命令从我们的 Moodle 实例获取证书链
openssl s_client -showcerts -servername nclhe-moodle.ncl-coll.ac.uk -connect nclhe-moodle.ncl-coll.ac.uk:443
下载了证书链中的所有 3 个证书https://nclhe-moodle.ncl-coll.ac.uk并检查它们是否已在
/etc/ssl/certs/ca-certificates.crt
文件中。果然,其中一个证书(中间证书)不在 ca-certificates.crt 文件中。使用以下命令将 1 个 .cer 文件转换为 .crt
openssl x509 -inform PEM -in QuoVadis_Global_SSL_ICA_G3.cer -out QuoVadis_Global_SSL_ICA_G3.crt
将.crt 文件上传到
/usr/local/share/ca-certificates
目录。运行命令
sudo update-ca-certificates
查看
/etc/ssl/certs/ca-certificates.crt
文件,发现文件中缺少证书,并且目录中已创建 2 个符号链接,/etc/ssl/certs
如下所示QuoVadis_Global_SSL_ICA_G3.pem->/usr/local/share/ca-certificates/QuoVadis_Global_SSL_ICA_G3.crt
35e514f6.0 -> QuoVadis_Global_SSL_ICA_G3.pem
停止并重新启动 apache
sudo /etc/init.d/apache2 stop sudo /etc/init.d/apache2 start
再次重试,但仍然有同样的错误
我还有一个问题:
在我的文件中,除了我刚刚申请的 CA 之外,/etc/ssl/certs
所有 CA 都是符号链接的。考虑到证书是文件的一部分,这是否是个问题?/usr/share/ca-certificates
/usr/local/share/ca-certificates
/etc/ssl/certs/ca-certificates/crt
我有点困惑,不知道还能尝试什么,我已经对此进行了广泛的研究,试图自己修复它,有人能帮忙吗
提前谢谢了,
苹果
最新更新 - 问题尚未解决。文件通过 API 自动上传,因此 turnitin 应用程序位于https://nclhe-moodle.ncl-coll.ac.uk用户登录后,点击几个按钮,应用程序就会通过 API 将文件上传到https://api.turnitinuk.com。唯一变化的是 SSL 证书于 2020 年 12 月成功续订,但这个问题直到 2021 年 2 月才开始出现。
答案1
从阅读您的问题来看,客户端是大学服务器,服务器是 TurnitinUK 服务器。
该消息告诉您大学服务器不信任 TurnitinUK 服务器。
您需要做的就是添加AAA 认证服务到您的ca-certificates.crt
文件 - 不再需要。此文件是您的信任锚存储,信任锚是 TurnitinUK 使用的根 CA。它不是添加所有证书-我可以徒劳地找到-希望事情会起作用的存储 :-)
正如您所注意到的,服务器会向您发送其所有证书(包括多余的根证书),因此您不需要在客户端添加它们(您永远不应该这样做)。您需要做的就是告诉客户端您信任链中的最后一个证书(根 CA 证书),PKI 的魔力会解决其余问题。任何由根 CA 签名的证书都是受信任的(一旦将其添加到信任库中),因此当服务器向您呈现您的下属 CA 和最终实体证书时,它们都是受信任的。
尝试清理,/usr/local/share/ca-certificates
只留下AAA 认证服务一次并重新运行update-ca-certificates
。