如何在不产生任何证书错误的情况下不信任 CA

2025年3月6日

“不信任 (distrust)”是指将向网站颁发 HTTPS 证书的证书颁发机构 (CA) 从根存储中移除,因为不再信任它颁发证书。这意味着由该 CA 颁发的证书将被视为无效,很可能在任何不信任该 CA 的浏览器中导致证书错误提示。发生不信任的原因可能是出于安全考虑、合规性要求,或者仅仅是因为对运营者的不信任。过去,不信任事件的复杂性和对用户的影响很大程度上取决于 CA 的规模和使用情况——CA 越大,不信任它的时间线就越长越复杂,并且用户遇到证书错误的可能性就越高。现在,情况已经不同了。

大多数用户代理1要求证书记录到公共的 certificate transparency (CT) 日志中。自从引入 CT 以来,大多数不信任不再是由于密钥泄露和域名验证失败造成的。如今,CA 不再像 2010 年代初期那样容易成为攻击目标,因为任何恶意颁发的证书仍然需要记录到 CT2 中才能在浏览器中被信任。这一要求意味着通过 CA 密钥泄露恶意颁发的证书是可公开审计和可见的。与其他 利用方法 相比,这大大降低了使用被攻破的 CA 密钥作为定向 MITM 攻击向量的价值。

如今,大多数不信任不是因为密钥泄露,而是因为 CA 反复未能遵守 Baseline Requirements (BRs) 的模式。BRs 是适用于所有 CA 的标准规则集,由 CA/Browser Forum (CABF) 维护。可以将 CABF 视为 CA 的 IETF,而 BRs 是定义 CA 行为的其他 RFC,包括如何执行 domain control validation (DCV)。

除了 CT 之外,现在的证书有效期也比 2010 年代短得多。这是件好事,因为更短的证书有效期更安全。目前证书的最大有效期(于 2020 年设定)为 398 天(13 个月),并且 CABF 正在进行一项 ballot,以逐步将其降低至 47 天,而在 2012 年之前,有效期是无限的,直到 2018 年仍然长达五年。这意味着证书颁发方式的任何变化(例如,要求 CT)都适用于 13 个月内所有具有时效性的证书。“遗留”证书最多只有一年有效期,我们可以通过搜索 CT 日志来识别完整的时效性证书集。

2010 年代最复杂的不信任事件都不具备这些属性——并非所有证书都记录到 CT,并且在任何给定时间都存在至少 2-5 年前颁发的时效性证书。这意味着当时的任何不信任事件都必须回顾现有证书,并展望尚未颁发的证书。CT 提供了不完整的有效证书集视图,并且具有超长有效期的时效性证书的存在意味着停止颁发证书的 CA 仍然可以拥有多年未过期的证书。

幸运的是,Web PKI 现在比十年前要好得多3。如今,不信任主要是 前瞻性的,这意味着它们不需要影响当前有效的证书,而是可以将不信任应用于 由被不信任的 CA 在某个未来日期之后颁发的任何证书。在此期间,在截止日期之前颁发的时效性证书将继续有效,即使它们的有效期超过截止日期。该阈值只需要应用于 NotBefore(开始)日期,而不是 NotAfter(到期)日期。

前瞻性的、无插页式不信任的机制是 SCTNotAfter。SCTNotAfter 约束是一种用于加密保证 NotBefore 日期的机制,可用于实施“grandfather in”现有证书的不信任,而不会有 CA 倒填证书日期以绕过不信任的风险(过去发生过这种情况!)。来自被不信任的 CA 的现有证书将继续工作而不会出现错误。SCTNotAfter 的工作原理是为某个 CA 证书选择一个“SCTNotAfter 日期”,然后要求任何通过该 CA 链接的叶证书都至少具有一个 SCT,其时间戳早于 SCTNotAfter 日期。这意味着该证书已在 SCTNotAfter 日期之前披露给至少一个 CT 日志。即使 CA 倒填 NotBefore 字段,SCT 中的时间戳仍然应该4 准确。

对于因重复的合规性失败而被不信任的 CA,此日期可以设置为将来。这为 CA 提供了为其最大有效期的任何现有证书重新颁发的时间,从而允许 CA 的每个客户都有完整的证书生命周期来过渡到新的 CA。但是,并非所有客户都会关注他们的 CA 是否已被不信任,可以推测的是,被不信任的 CA 将在 SCTNotAfter 日期之后停止颁发证书,因为它们在浏览器中不起作用。当续订时间到来时,客户将无法从被不信任的 CA 获得新证书,并且可以迁移到新的 CA。借助 SCTNotAfter,客户在截止日期之后有一个完整的证书生命周期来计划向新 CA 的过渡。一旦在 SCTNotAfter 日期之前颁发的每个证书都过期,就可以安全地从根存储中删除被不信任的 CA。

在发生安全事件或密钥泄露时,可以将 SCTNotAfter 日期设置为过去。假设我们在时间 T 了解到 Honest Achmed’s CA 在时间 P 被攻破,其中 P 在 T 之前。将 SCTNotAfter 日期设置为 P - 1 允许来自攻破之前的每个现有证书继续使用其剩余的生命周期,同时将不信任限制为仅来自攻破之后的证书。这允许尽可能多的证书继续工作,同时阻止任何潜在的恶意证书。

Chrome 对 GLOBALTRUSTEntrust 的不信任都是使用 SCTNotAfter 实现的。与 Symantec 的不信任不同,这两种不信任都没有导致意外的面向用户的证书插页。这对用户安全和用户体验都是一种改进。

虽然有时需要不信任,但对用户安全而言,最好的结果仍然是一个强大的 Web PKI,每个 CA 和浏览器都致力于持续改进和用户安全。当所有参与者都致力于用户安全时,不信任的情况会很少发生。

  1. Firefox、Chrome、Edge、Brave 和 Safari 都要求记录证书(非详尽列表)。 ↩︎
  2. inb4 SCT 是一种承诺,而不是包含证明。看,CT 日志很难正确运行,更不用说恶意运行了。浏览器可以审核 SCT 以包含在内。 ↩︎
  3. 生活,欢笑,爱。蓬勃发展,人们可能会说。 ↩︎
  4. 同样,CT 日志也可能在撒谎!但是这是可审计的,并且没有证据表明它曾经发生过。如果发生过,可以通过将需求从 任何 SCT 切换到 所有 SCT 来缓解,这将需要多个 CT 日志来串通关于时间戳的信息。 ↩︎