这目前导致我们的网站无法正常运行,这里的所有帖子似乎都涉及自托管网站。
❯ openssl s_client -connect (removed).com:443 -servername (removed).com
CONNECTED(00000005)
depth=1 O = Digital Signature Trust Co., CN = DST Root CA X3
verify error:num=10:certificate has expired
notAfter=Sep 30 14:01:15 2021 GMT
verify return:0
depth=1 O = Digital Signature Trust Co., CN = DST Root CA X3
verify error:num=10:certificate has expired
notAfter=Sep 30 14:01:15 2021 GMT
verify return:0
depth=3 O = Digital Signature Trust Co., CN = DST Root CA X3
verify error:num=10:certificate has expired
notAfter=Sep 30 14:01:15 2021 GMT
verify return:0
---
Certificate chain
0 s:/CN=(removed).com
i:/C=US/O=Let's Encrypt/CN=R3
1 s:/C=US/O=Let's Encrypt/CN=R3
i:/C=US/O=Internet Security Research Group/CN=ISRG Root X1
2 s:/C=US/O=Internet Security Research Group/CN=ISRG Root X1
i:/O=Digital Signature Trust Co./CN=DST Root CA X3
---
API 端点向我们返回了证书已过期的错误,已通过 Postman 验证。
RGJ
(Richard - Communiteq)
4
这听起来像是您这边(即您的网站端)的问题。服务器提供的证书没有问题,几乎所有浏览器都能接受;问题在于许多旧服务器在其信任库中尚未包含(相对)新的根证书,因此目前许多自动化操作会报错。
由于我不清楚您网站的具体情况,我选取了一个任意的 hosted-by-discourse.com 站点,并通过 Qualys SSL 服务器测试 进行了检测。
您可以看到,第二个证书链的根证书确实已过期,但这一风险已通过 ISRG Root X1 证书存在于信任库中(即包含在您的浏览器和/或操作系统中)的第一个证书链得到缓解。
服务器通常不会频繁更新其信任库,因此您的服务器可能尚未在其信任库中包含 ISRG Root X1 证书。(邮件接收 Docker 镜像也曾遇到同样的问题)。
您可以在 https://curl.se/ca/cacert.pem 等网站找到最新的证书包。在 CentOS 上,该文件应放入 /etc/pki/ca-trust/extracted/pem/tls-ca-bundle.pem。在 Ubuntu 上,您可以使用 update-ca-certificates 命令,它将更新 /etc/ssl/certs/ca-certificates.crt。
或者,您也可以暂时在服务器代码中禁用 SSL 证书验证。
我发布了 openssl 的输出结果,以证明这与我们的网站无关,而且 Postman 是在本地 Windows 机器上运行的。
编辑:我对不同级别的信任存储了解不够,我会进一步研究,但这种情况在我们尝试的每一台机器上都会发生。
RGJ
(Richard - Communiteq)
6
当您使用真实浏览器时,它不会失败,对吗?
编辑:更多人报告在使用 Postman 时遇到问题,所以我想那不是一个有效的测试…… 
这是我从我们的 DevOps 人员那里收到的回复。
问题在于,ISRG Root X1 有两个副本:其中一个很久以前由 DST Root CA X3 签发,另一个较新的副本则由 ISRG(即管理 Let’s Encrypt 等业务的组织)自签名。目前,这个自签名的根证书已在大多数系统中被接受为受信任的根证书。
这两个是相同的签名证书,因此您可以使用任一版本验证任何声称由“ISRG Root X1”签发的内容。但是,由 DST 签发的该版本已不再有效,因为其签名证书(DST 证书)现已过期。
如果服务器行为正确,提供了较新的自签名 ISRG Root X1,客户端会将提供的证书与其自身的信任存储进行比对,验证两者是否为同一证书,从而通过验证。然而,实际情况是客户端看到提供的证书后,会尝试使用本地存储的 DST Root CA X3 进行验证,结果发现该证书已过期,导致验证失败。
RGJ
(Richard - Communiteq)
8
在证书链中提供一个本应存在于受信任根 CA 存储中的证书,这绝对算不上“做对了”。
让我们看看 letsencrypt.org 自身的证书链:SSL Server Test: letsencrypt.org (Powered by Qualys SSL Labs)
嘿,看。他们也在做同样的事,证书链完全相同(当然除了服务器证书)。
所以,要么你的运维人员错了,要么 CDCK、LetsEncrypt 和 Qualys 全都错了。
告诉他更新根 CA 存储。这会解决问题。相信我。
david
(David Taylor)
9
你好 @bpaterson2000 - 很遗憾听到您在连接我们的托管服务时遇到了问题。正如 @RGJ 所提到的,问题并不出在 Discourse 端,而是需要在您的客户端上进行修复。(我们的服务器并不“提供”根证书,它们由您的客户端管理)
您可以从 Let’s Encrypt 获取更多关于此变更的详细信息:
感谢提供信息,这对我们来说是一个意外的问题,因为错误 apparently 来自托管服务器。
我们使用 Heroku,它通过 node/packages 捆绑了您提到的内容——看起来更新 Node 是成功重新连接到 Discourse REST API 的关键。
感谢您的帮助。