我的操作系统 (Linux) 如何使安全证书无效?

mac*_*ost 5 linux https

我可以在非 Linux 机器(包括我的手机)上访问https://ce.uci.edu网站,没有问题。但是当我在我的 Linux 计算机上浏览它时,无论是 Chrome 还是 Firefox,我都会收到错误“NET::ERR_CERT_AUTHORITY_INVALID”。

为什么我的操作系统会导致这种情况,而其他人则不会?安全证书验证不应该独立于操作系统吗?

这会导致与 IT 部门的尴尬对话,因为他们看不到问题。

use*_*686 10

服务器没有发送“中间”证书(又名“链”),因此客户端根本没有足够的信息来验证。

您的桌面浏览器和/或您的操作系统通过缓存它看到的所有中间证书来解决这个问题。当您访问此站点时,浏览器会使用其缓存来完成链。移动浏览器和非浏览器应用程序通常不会这样做。

这会导致与 IT 部门的尴尬对话,因为他们看不到问题。

除了在浏览器中打开网站之外,他们不知道如何正确检查。(“如果它打开,它就可以工作。”)

尝试向他们提供例如来自https://www.ssllabs.com/ssltest/的扫描结果,这是一个广泛使用的网站,它试图准确检测此类错误配置等。

安全证书验证不应该独立于操作系统吗?

过程本身 - 是的(主要是;它可能会变得复杂)。

(让我们忽略诸如错误或时钟不匹配之类的琐碎问题。)

“受信任的”根 CA 列表

第一个区别是许多浏览器不使用他们自己的“受信任”证书颁发者列表——他们将该部分委托给操作系统,每个操作系统可能有不同的列表。微软和苹果当然有他们自己的操作系统可信发行者程序,而大多数 Linux 发行版使用 Mozilla 的列表。(我相信 Google 也有专门针对 Android 的,但没有针对桌面 Chrome 的。)

  • 例如,IE 和 Edge/UWP 始终使用 Windows“SChannel”TLS 堆栈,包括其证书验证和根 CA 列表。
  • 尽管 Chrome 使用自己的“BoringTLS”库,但它也会调用 Windows TLS 证书函数(因此使用 Windows CA 列表)。但是,它在基本 CA 检查之上应用自定义策略,例如根据发布日期拒绝某些签名类型。
  • Firefox 内置了 Mozilla CA 列表,并在其“NSS”库中内部执行所有操作。同样,它可以添加超出标准验证的策略限制。
    • 但是在 Windows 上,除了内置列表之外,Firefox 还可以选择从操作系统列表中加载管理员安装的根 CA。(重要的是,即使手动启用此功能,它仍然不会加载默认 CA。)
    • 同样在 Linux 上,一些 Linux 发行版修补 NSS(以及 Firefox)以始终使用系统范围的 CA 列表而不是内部列表。这加载默认的系统 CA。
  • Windows 上的大多数非浏览器应用程序使用 SChannel,但有些使用 OpenSSL。像 Chrome 那样让 OpenSSL 遵循 Windows TLS 验证相对困难,因此这些应用程序经常捆绑自己的 CA 集(名为 的文件curl-ca-bundle.crt,它是 Mozilla 列表的副本),有时该文件变得相当过时。
  • 然后是Java...

缓存

还有“中间缓存”的问题。商业 Web 证书总是至少使用 2 层系统颁发:根 CA 是离线保护的,并且只颁发“中间”证书,并且只有那些证书在线并允许颁发服务器证书。要通过验证,客户端需要了解整个“链”。

通常客户端只有根 CA,服务器发送中间证书。但有时系统管理员会错误配置服务器(或无法正确配置),导致中间件未发送,并且验证链中断。例如,您的站点使用由“InCommon RSA Server CA”颁发的证书,该证书比根 CA 低一级。但是它本身并不发送 InCommon 证书,因此无法将其与“受信任的根 CA”列表进行匹配。

为了应对这些错误,一些浏览器——以及一些操作系统——建立了一个以前看到的中间 CA 的缓存。(Windows 缓存那些它必须自己下载的文件;Firefox 缓存它看到的每一个中间件。)这意味着如果你正在访问一个配置错误的网站,成功/失败现在可能因用户而异,因为它们都有不同的建立的缓存。

这变得尤其有害,当系统管理员的自动反应是“这工作我的系统上精”,因为他们可能已经在不知不觉中它只是他们的系统上运行。

连锁建设

有时,由于已经进行了“交叉签名”,多个链可能对同一个证书有效。例如,我们的加密证书可的IdenTrust的“DST根CA X3”植根或者他们可以在扎根自己的闪亮的新“ISRG根X1”,这取决于客户端已经和这取决于中间体服务器发送(它可以发送不止一个)。

一些美国 mil/gov 网站使用他们自己的联邦 PKI 证书,而不是来自商业 CA 的证书。Windows 是唯一带有“可信”根 CA 的操作系统,其他浏览器不会接受它,除非您手动安装一些根 CA。并根据安装的根CA,在同一个网站可以有许多可能的信任路径,有时可达链中的6-7证书。

不同的浏览器——尤其是那些将验证卸载到操作系统的浏览器——在这种情况下可能会提出不同的可能链——例如,Windows 非常灵活,而 OpenSSL 在 1.1.x 之前非常缺乏,Firefox 经历了三个重写它的链接构建代码。(当前使用的库 mozilla::pkix 一开始被称为“insanity::pkix”,这应该会给你一个关于它有多么复杂的提示。)

权限信息访问

我提到 Windows 能够自行下载那些缺少的中间体——尽管在技术上是一个标准功能,但一些浏览器出于隐私考虑完全拒绝实现它,而另一些浏览器由于额外的不必要的复杂性而不会打扰它。这是 Windows 和 Linux 之间的另一个区别。

(同样,这个功能在美国“联邦 PKI”中被大量使用,其中交叉签名很普遍,系统开始看起来更像是一个网格而不是一个有根的层次结构。例如,组织 A 可能会识别链 A?B?C? D,另一个可能识别 B?A?C?D 或 B?C?D 具有完全相同的服务器证书 D。)