通过 Curl 访问时,在有效证书上获取 SSL 证书错误

通过 Curl 访问时,在有效证书上获取 SSL 证书错误

我有一个通配符 SSL 证书,它为 提供支持*.mysite.com。该网站可以从所有浏览器访问,没有任何问题。还有一个服务(在不同的服务器上),其 URL 为:service.mysite.com。奇怪的是,当我使用 curl 访问时,service.mysite.com我得到了这个:

curl: (60) SSL certificate problem: certificate has expired

经过进一步挖掘,我发现我确实可以service.mysite.com从 Ubuntu 18.04 服务器访问,但不能从 Ubuntu 14.04 访问。这告诉我,也许我的 CA 包有问题。

所以我这样做了:

curl -vv --cacert mysite.ca-bundle.crt https://service.mysite.com

mysite.ca-bundle.crt是我从 SSL 提供商收到的。但我仍然收到完全相同的错误。我遗漏了什么?

答案1

您没有提供网站的实际地址,也没有提供 SSL 提供商的名称或有关证书的任何其他信息,基本上是想让我们猜测各种可能的原因。

我的猜测是,您的证书链以“AddTrust External Root”作为最顶层 CA 结束,并且该根证书几个小时前刚刚过期。

证书所有者 Sectigo有图表链的 – 由于旧 CA 证书交叉签名了新证书,“AddTrust External Root”基本上是更高层级多于通常是公司的实际根 CA。新操作系统会将 Sectigo/Comodo 的证书视为自签名根 CA,而旧操作系统会将其视为 AddTrust Root 之下的中间 CA。

因此在旧的操作系统上仅有的通过 AddTrust Root CA 证书交叉签名来识别 Sectigo,一旦后者过期,整个链将失效。要解决此问题,您必须切换到这些系统识别为根的另一个 CA(检查/etc/ssl/certs)。


这些系统可能承认 Sectigo 本身就是根 CA。理论上,证书通过多个链进行验证是完全合法的,例如,一个 CA 可以同时是根由另一个 CA 交叉签名。

在实践中,许多 TLS 客户端库在构建替代链方面确实很糟糕,并且假设始终只有一种方法来验证证书。 (Windows 稍好一些,大型网络浏览器还包含代码来处理 TLS 库所提供的额外复杂性。)

例如,旧版本的 OpenSSL非常对于哪些证书可以充当信任根,OpenSSL 1.0 有严格的限制。如果服务器发送了“OldCA–NewCA–Intermediate–MyServer”链,OpenSSL 1.0 会仅有的如果您拥有“OldCA”作为受信任的证书,它就会接受它 - 但如果您拥有“NewCA”,它就不会足够智能地接受它。


因此,如果 Ubuntu 14.04 已经将 Sectigo 识别为证书颁发机构,那么您需要修复由您的 Web 服务器发送的证书链 - 我认为删除标有“Issuer: AddTrust”的证书就足够了。

假设旧的证书链如下所示:

[AddTrust External Root]                               [included in OS]
+-- USERTrust RSA Certification Authority (Sectigo)    sent by your server
    +-- Gandi Standard SSL CA 2                        sent by your server
        +-- git.kernel.org                             sent by your server

您需要对其进行编辑,以便您的服务器停止发送交叉签名的 USERTrust 证书:

[USERTrust RSA Certification Authority (Sectigo)]      [included in OS]
+-- Gandi Standard SSL CA 2                            sent by your server
    +-- git.kernel.org                                 sent by your server

您也可以在客户端修复此问题,通过删除 AddTrust 根 CA

答案2

今天我们遇到了同样的问题,我们的 14.04 出现故障,而 18 运行正常。看来今天是流行的根支持停止为旧版 Ubuntu 机器工作的日子。幸运的是,我们刚刚停用了 14,但如果你不能,那里有一些说明可以尝试让它工作。此外,我们的 DevOps 团队指出,这可能还需要一些繁重的工作来升级 OpenSSL 并使其与此处描述的更改兼容。 https://support.sectigo.com/articles/Knowledge/Sectigo-AddTrust-External-CA-Root-Expiring-May-30-2020

答案3

您需要从我的 Linux mint 中的AddTrust External Rootcacert.pem 或信任链中删除它。/usr/lib/ssl/certs/AddTrust_External_Root.pem

对于那些好奇的人,你可以从 Mozilla 获取 cacert.pem:https://curl.haxx.se/docs/caextract.html 然后您需要删除AddTrust External Root

删除AddTrust External Root强制软件使用正确的路径认证(当您有多个时)。

例如,twinoid.com 有 3 条路径。其中两条有效,最后一条包含AddTrust External Roothttps://www.ssllabs.com/ssltest/analyze.html?d=twinoid.com&hideResults=on(你可以在那里检查 3 条路径)

当然,正确的修复应该由无法正确处理此问题的软件来执行,但这个临时修复拯救了我。一些软件(如浏览器)不久前已经修复了此问题。

相关内容