我在实施 SSL 时遇到了一个令人沮丧的问题,可能与以下情况有关:Let's Encrypts CA-X3 证书过期。
事先警告一下,我是一个对 SSL 了解有限的开发人员。
在 Postman 中测试请求出现错误:
SSL Error: Unable to get local issuer certificate
运行openssl s_client -connect abcd.mydomain.com.au:443
显示以下证书链:
Certificate chain
0 s:CN = *.abcd.mydomain.com.au
i:C = US, O = Let's Encrypt, CN = R3
1 s:C = US, O = Let's Encrypt, CN = R3
i:O= Digital Signature Trust Co., CN = DST Root CA X3
有人能帮我诊断并纠正这个问题吗?我不确定在哪里/如何诊断和修复这个问题。
OS: Ubuntu 18.04.4 LTS
OpenSSL: 1.1.1
ca-certificates: 20211016~18.04.1
答案1
此错误是由于您的系统认为您使用的证书是自签名证书而导致的。发生这种情况的原因是 Let's Encrypt CA“最近”(2021 年 9 月)进行了更新,并且不在您的受信任证书存储中。
为了解决这个问题,请按照评论中的建议升级您的ca-certificates
软件包。此软件包包含 Ubuntu 中所有受信任的 CA,并且已更新以反映 LE 证书链中的这一变化。
您可以使用以下方式执行此操作:
sudo apt-get update
sudo apt --only-upgrade install ca-certificates
注意:您问这个问题表明您没有制定定期系统更新流程。您可能需要咨询运营部门或使用类似以下方法自动升级无人值守升级
此错误也可能是由于缺少中间证书而导致的。为了解决这个问题,您可以将添加/etc/letsencrypt/live/$domain/chain.pem
到 Postman 配置中。(不知道该怎么做,从未使用过 Postman)
答案2
您的问题与 DST X1 有关,但实际上比通常的“CA 过期”主题更深入一些。
受信任的 CA 更新暂时不会有帮助,因为服务器目前提供的是过时的 LE 中间版本,可以仅有的链接到 DST CA – TLS 客户端首先无法将其与 ISRG CA 关联。您看到的链以前是很久以前就已经正确了,在“ISRG Root CA”建立之前。
(通过卸载 DST CA 解决的其他类似问题实际上是使用较新的证书链,其中 LE 中间件由 ISRG CA 签名,并且那由 DST CA 交叉签名,允许两种替代验证路径。
换句话说,您的 s_client 输出显示了一个非常过时的证书链 - LE 的 ACME 服务器很久以前就停止提供该证书链,甚至早在 2021 年 9 月 DST 到期之前。这表明以下两件事之一:
证书是手动安装的,没有设置任何自动续订,并且这样放了好几年(而且没人关心它是否过期)。强制续订可能会解决这个问题。
- 或者,您拥有的 ACME 客户端仅适用于 ACMEv1,当 LE 将其完全替换为 ACMEv2 时,该客户端停止工作,因此自动续订也停止了。(acmetool 就发生了这种情况。)
或者,证书是正在自动续订,但自动化程序向 Web 服务器提供了错误的证书文件。例如,已颁发的服务器证书是从 ACME 客户端更新的 cert.pem 中读取的,但“证书链”是从手动复制粘贴的 chain.pem 中读取的,因此无法从 ACME 获取更新。
此处的具体设置取决于您使用的 ACME 客户端,但在所有情况下,Web 服务器都应使用仅有的来自 ACME 客户端的“live”或“output”文件夹的文件。如果您使用的是 Certbot,则
fullchain.pem
具有服务器的证书和正确的中间链(对于喜欢组合文件的网络服务器而言),并且chain.pem
在同一目录中只有中间件(对于喜欢单独文件的网络服务器而言)。例如,在 Apache httpd 中,这是正确的:
SSLCertificateFile /etc/letsencrypt/live/example.com/fullchain.pem
在 2.4 中已过时但可以接受:
SSLCertificateFile /etc/letsencrypt/live/example.com/cert.pem SSLCertificateChainFile /etc/letsencrypt/live/example.com/chain.pem
不正确:
SSLCertificateFile /etc/letsencrypt/live/example.com/cert.pem SSLCertificateChainFile /root/letsencrypt_chain.pem
无论如何,不应手动编辑 .pem 文件曾经是需要的(除了可能将它们转换为另一种格式)。
但我会建议删除证书并从头开始重新执行,使用最新的 ACME 客户端(certbot、lego 或基于 shellscript 的程序之一)——并为下一个人留下评论。不过在删除它之前,请使用openssl x509 -text
或快速certtool -i
查看一下它是为哪些域颁发的。
答案3
此错误的原因在于客户端与服务器之间的 SSL 通信中根证书和中间证书配置错误。另一个原因也可能是自签名证书。
由于您使用的是 Ubuntu 18.04,因此应确保您的 CA 证书是最新的。您提到您的 ca-certificates 版本是 20211016~18.04.1,这似乎相对较新。但是,Let's Encrypt 已过渡到 ISRG Root X1 作为默认根证书,取代了 DST Root CA X3。
尝试通过运行以下命令更新您的 CA 证书:sudo apt update sudo apt install --only-upgrade ca-certificates
另外,您可以更新 SSL 捆绑包。获取 CA 捆绑包文件并将其保存在您的服务器上。我通过以下方式找到了此解决方案https://www.ssl2buy.com/wiki/fix-ssl-certificate-problem-unable-to-get-local-issuer-certificate
下载 Let's Encrypt 软件包 -https://letsencrypt.org/certs/lets-encrypt-x3-cross-signed.pem 如果有人使用其他 CA 证书,则可以从此处下载 CA 包 -https://www.ssl2buy.com/wiki/ssl-intermediate-and-root-ca-bundle