我可以在非 Linux 机器(包括我的手机)上毫无问题地访问网站https://ce.uci.edu 。但是当我在我的 Linux 计算机上浏览它时,无论是在 Chrome 还是 Firefox 中,我都会收到错误“NET::ERR_CERT_AUTHORITY_INVALID”。
为什么我的操作系统会导致这种情况,而其他人不会?安全证书验证不应该独立于操作系统吗?
这使得与 IT 部门的谈话很尴尬,因为他们没有看到问题。
我可以在非 Linux 机器(包括我的手机)上毫无问题地访问网站https://ce.uci.edu 。但是当我在我的 Linux 计算机上浏览它时,无论是在 Chrome 还是 Firefox 中,我都会收到错误“NET::ERR_CERT_AUTHORITY_INVALID”。
为什么我的操作系统会导致这种情况,而其他人不会?安全证书验证不应该独立于操作系统吗?
这使得与 IT 部门的谈话很尴尬,因为他们没有看到问题。
服务器没有发送“中间”证书(又名“链”),所以客户端根本没有足够的信息来验证。
Your desktop browser and/or your OS papers over this problem by caching all intermediate certificates it sees. When you visit this site, the browser uses its cache to complete the chain. Mobile browsers and non-browser apps generally don't do that.
They don't know how to check properly, beyond just opening the website in a browser. ("If it opens, it works.")
Try giving them e.g. the scan results from https://www.ssllabs.com/ssltest/ which is a widely used website which tries to detect exactly this kind of misconfiguration among others.
The process itself – yes (mostly; it can get complicated).
(让我们忽略诸如错误或时钟不匹配之类的琐碎问题。)
“受信任的”根 CA 列表
第一个区别是许多浏览器不使用自己的“受信任”证书颁发者列表——它们将这部分委托给操作系统,每个操作系统可能有不同的列表。微软和苹果当然有他们自己的操作系统受信任的发行程序,而大多数 Linux 发行版都使用 Mozilla 的列表。(我相信 Google 也有专门针对 Android 的,但不是针对桌面 Chrome 的。)
curl-ca-bundle.crt
,它是 Mozilla 列表的副本),有时该文件会变得相当过时。缓存
还有“中间缓存”的问题。商业 Web 证书始终使用至少 2 层系统颁发:根 CA 离线保护,只颁发“中间”证书,只有这些证书在线并允许颁发服务器证书。要通过验证,客户端需要了解整个“链”。
通常客户端只有根 CA,服务器发送中间证书。但有时系统管理员会错误地配置服务器(或者无法正确配置),从而导致中间件无法发送,并且验证链被破坏。例如,您的站点使用由“InCommon RSA Server CA”颁发的证书,该证书比根 CA 低一级。但它本身并不发送 InCommon 证书,因此不可能将其与“受信任的根 CA”列表进行匹配。
为了应对这样的错误,一些浏览器——以及一些操作系统——建立了以前见过的中间 CA 的缓存。(Windows 会缓存它必须自己下载的那些;Firefox 会缓存它所看到的每个中间体。)这意味着如果您访问的是配置错误的网站,成功/失败现在可能因用户而异,因为它们都有不同的缓存建立起来。
当系统管理员的自动响应是“它在我的系统上运行良好”时,这变得特别有害,因为他们可能在不知不觉中让它只在他们的系统上运行。
连锁建设
有时,由于进行了“交叉签名”,多个链可能对同一个证书有效。例如,Let's Encrypt 证书可以植根于 IdenTrust 的“DST Root CA X3” ,或者它们可以植根于他们自己闪亮的“ISRG Root X1”,这取决于客户端拥有什么以及服务器发送的中间体(它可以发送多个)。
一些美国 mil/gov 网站使用他们自己的联邦 PKI 证书,而不是来自商业 CA 的证书。Windows 是唯一带有“受信任”根 CA 的操作系统,除非您手动安装一些根 CA,否则其他浏览器不会接受它。根据您安装的根 CA,同一个网站可能有许多可能的信任路径,有时链中最多有 6-7 个证书。
不同的浏览器——尤其是那些将验证卸载到操作系统的浏览器——在这种情况下可能会提出不同的可能链——例如,Windows 非常灵活,而 OpenSSL 在 1.1.x 之前曾经非常缺乏,Firefox 经历了3次重写它的链接构建代码。(当前使用的库,mozilla::pkix,一开始被称为“insanity::pkix”,这应该给你一个关于它有多么不必要的复杂性的提示。)
权威信息访问
我提到 Windows 能够自行下载那些缺少的中间体——尽管在技术上是一个标准功能,但由于隐私问题,一些浏览器完全拒绝实现它,而另一些浏览器则由于额外的不必要的复杂性而不理会它。这造成了 Windows 和 Linux 之间的另一个区别。
(同样,此功能在美国“联邦 PKI”中大量使用,其中交叉签名很普遍,系统开始看起来更像一个网格而不是根层次结构。例如,组织 A 可能会识别链 A→B→C→ D,另一个可能会识别 B→A→C→D 或 B→C→D 具有完全相同的服务器证书 D.)