根上述站点(Comodo和USERTrust)使用的 CA 证书已于今天早上(UTC 时间)过期。虽然我发现两个不同的 Root CA 证书会在同一秒过期,但我发现这很了不起,这可以通过隶属于 Comodo(现为 Sectigo)的 USERTrust来解释。
编辑:这两个实际上从来都不是根 CA 证书,而是由"AddTrust External CA Root"签名的中间CA。因此,它们的到期日期取决于“AddTrust External CA Root”证书的有效性,该证书也恰好在同一秒到期。
现在,已在 2010 年发布了更新的证书(与过期的证书共享其私钥)(Comodo、USERTrust)。这些证书是当今常见的 Root CA 存储(包括 Apple 的系统信任存储)的一部分,因此浏览器可以完美地建立连接。对于大多数 cURL 变体(例如来自 MacPorts 或 Homebrew)也是如此,它们是针对自定义 OpenSSL 安装构建的。
macOS 10.14 的内置 cURL 变体是针对 LibreSSL 构建的,并/etc/ssl/cert.pem
用作其根 CA 存储,其中还包括新证书。但是,似乎有些东西会导致 cURL 或 LibreSSL 更喜欢旧证书进行有效性检查。我想 cURL 至少在某种程度上涉及到问题,因为我无法使用/usr/bin/openssl s_client
(/usr/bin/openssl
实际上是从 LibreSSL 构建的)连接失败。
我的假设是问题是由站点将过期的根 CA 证书作为其证书链的一部分发送的。在此类链中包含根 CA 是允许的,但不是必需的,在这种情况下似乎会破坏证书验证。
编辑:这是围绕“AddTrust External CA Root”到期的一系列问题的一部分。请参阅Andrew Ayer 的这篇博客文章或Ryan Sleevi 的这个Twitter 线程以了解更大的图景。Ryan Sleevi 也有一系列因过期而失败的东西。
在 macOS 10.15 上,cURL 默认使用 OpenSSL 0.9.8,显然可以通过设置 environment variable来缓解这个问题CURL_SSL_BACKEND=secure-transport
。这不适用于带有 LibreSSL 的 10.14,根据 Christian Heimes的说法,它通常会受到该问题的影响。