今天,我们帮助了一个遇到奇怪而神秘的浏览器问题的人,他们无法在最新的 Windows 机器上使用 Chrome 和 Microsoft Edge 连接到特定的 HTTPS 站点;当他们尝试这样做时,Chrome(和 Edge)报告说 TLS 证书是由未知的证书颁发机构颁发的。他们机器上的 Firefox 可以连接,我可以连接各种浏览器(包括我可以访问的一些 Windows 10 机器上的 Chrome 和 Microsoft Edge)。鉴于此条目的标题,您已经知道最终原因;该网站的 TLS 证书由该网站未提供的中间证书签名。

缺少TLS中间证书会造成神秘的浏览器问题插图

由于缺少中间证书,网站的 TLS 证书看起来像是由未知 CA 签名的,即 中间证书名称的“CA” (尽管 Chrome 和 Microsoft Edge 都没有报告未知 CA 的名称,可能是因为充分的理由)。该网站可以在其他浏览器中运行,因为浏览器会静默缓存他们以前见过的中间 TLS 证书此外还愿意在适当的情况下下载它们。遇到此问题的人几乎从不使用 Chrome 或 Microsoft Edge(他们主要使用 Firefox),因此这些浏览器以前从未有机会看到 此特定的中间证书 。

(更糟糕的是,我认为这个特定的中间证书已被弃用,所以你不会发现很多网站仍在使用它并提供给你。)

对于很多人来说,这是一个很难看到的问题,更不用说识别了。浏览器的中间证书缓存基本上是不可见的,我认为大多数浏览器都无法清除缓存或使用空缓存来明确检查您的网站(并且 Firefox 会主动预先填充其缓存,其中包括此特定的中间证书)。如果您是网站开发人员或系统管理员,并且您检查了这样的网站,那么您的常规浏览器很可能会缓存必要的中间证书。在 Firefox 中,我认为您必须使用新的临时配置文件来测试您的网站(并在创建配置文件后立即进行,然后 Firefox 开始在您身上下载中间体)。

弄清楚实际问题花了我相当长的时间。首先我花了一段时间在各种环境中尝试了一些浏览器,然后我认为机器上的 Windows 可能有一个不完整或损坏的根证书存储。只有当我开始仔细观察 Chrome 对另一台 Windows 机器上证书的看法时,我才注意到特定证书是中间证书,而不是 CA 证书,并且一分钱都掉了。我不确定非专业人士能否诊断出问题,即使诊断出问题也不容易解决。

(该网站的 TLS 证书包括一个“颁发证书 URL”(来自RFC 5280 第 4.2.2.1 节),因此如果浏览器愿意,它可以将其与完全未知的证书颁发机构区分开来。)

回想起来,有一条重要的线索被我忽略了,还有一些我应该做的事情。重要的线索是我常用的证书信息转储工具certigo报告它无法验证证书链;当时我把它写成“也许 Fedora 的根证书列表很奇怪”,但我不应该这样做。我应该做的显而易见的事情是立即通过SSL Server Test运行该站点,这会立即指出问题所在。我也可以在我的机器上使用新的临时 Firefox 配置文件尝试该站点,这也可能会指出问题所在。

(我当时懵逼了,主要是因为我认为这是一个客户端问题而不是服务器问题。部分是我对 Windows 的偏见。)

在许多环境中,命令行工具对于诊断这类事情很有用,因为它们(大部分)不下载或缓存中间证书。相反,它们中的大多数仅通过 TLS 连接中提供的证书和本地 CA 信任库(可能包括中间证书但通常不包括)来验证服务器的 TLS 证书。如果您的浏览器可以正常工作,但出现类似certigo的问题,通常是缺少中间体,或者您的系统 CA 信任库不完整。下次我需要记住这一点。

PS:在某一时刻,Firefox 有一个 about:config 首选项,可用于禁用其中间证书缓存等,但从那时起,该首选项似乎在代码重写中消失了。