如何在没有任何证书错误的情况下拒绝信任CA
Hacker News 摘要原标题:How to distrust a CA without any certificate errors
本文讨论了如何在没有任何证书错误的情况下,拒绝信任某个证书颁发机构(CA)。当一个CA被移出根存储时,意味着它不再被信任来颁发证书,这将导致该CA颁发的证书被视为无效,并可能在任何不信任该CA的浏览器中出现证书错误。拒绝信任CA可能出于安全原因、合规原因,或对其运营者缺乏信任。
过去,拒绝信任的复杂性和用户影响主要取决于CA的规模和使用情况;规模越大的CA,其拒绝信任的时间线通常越长越复杂,用户遇到证书错误的可能性也更大。然而,现今情况有所不同。大多数用户代理(如浏览器)要求证书必须记录在公共证书透明性(CT)日志中。CT的引入使得大多数拒绝信任不再因密钥泄露和域验证失败而产生。与2010年代早期相比,如今的CA不再是容易攻击的目标,因为任何恶意颁发的证书必须记录到CT中才能在浏览器中被信任。
每个证书必须附带一组签名证书时间戳(SCT),通常嵌入在证书中,也可以在TLS握手过程中提供。SCT证明了证书将被包含在CT日志中。CT日志的要求意味着,通过CA密钥泄露颁发的恶意证书可以被公众审计和监视,这大大降低了利用受损CA密钥进行针对性中间人攻击的价值。
如今,CA的拒绝信任往往基于反复未能遵守基线要求(BRs)的模式,BRs是适用于所有CA的一组标准规则,由CA/浏览器论坛(CABF)维护。此外,目前证书的有效期比2010年代时更短,这在安全性上是一个好变化。2020年设定的当前最大证书有效期为398天(13个月),CABF中有提议逐步降低至47天,而2012年前是无限期,有效期可长达五年。
现在,所有时间有效的证书的变化,比如要求CT,将适用于13个月内所有有效的证书。所谓“遗留”证书最久不过一年。通过查阅CT日志,能够识别出全套有效证书。2010年代的复杂拒绝信任事件中并非所有证书都记录在CT中,而且在任何特定时刻都存在至少2-5年的有效证书,这使得当时的拒绝信任必须向后回溯现有证书,同时也要关注尚未颁发的证书。
如今,Web PKI的状况比十年前好多了。现在的拒绝信任主要是前瞻性的,意味着不必影响当前有效的证书,而是可以将拒绝信任应用于在某个未来日期之后颁发的证书。在这个时期,颁发在截止日期之前的有效证书继续有效,即使其有效期延续至截止日期之后。阈值仅需要应用于NotBefore(开始)日期,而不是NotAfter(过期)日期。
前瞻性拒绝信任的机制是SCTNotAfter。SCTNotAfter约束是一种对NotBefore日期的密码学保证,可以用来实施拒绝信任,同时“保留”现有证书,避免CA伪造证书来规避拒绝信任(这在过去曾发生过)。来自被拒绝信任的CA的现有证书将继续有效而不会产生错误。SCTNotAfter通过选择某个CA证书的“SCTNotAfter日期”,并要求任何通过该CA链的叶证书至少具有一个在SCTNotAfter日期之前的时间戳的SCT,这样可以确保证书在SCTNotAfter日期之前已被披露到至少一个CT日志中。
如果CA在SCTNotAfter日期之前伪造了NotBefore字段,SCT中的时间戳仍然应该是准确的。对于因多次未能遵守要求而被拒绝信任的CA,这个日期可以设定为未来,以便给予CA重新颁发所有现有证书的时间,让每个CA的客户拥有完整的证书生命周期以过渡到新CA。然而,并非所有客户都会关注他们的CA是否被拒绝信任,假设被拒绝信任的CA将在SCTNotAfter日期后停止颁发证书,因为颁发的证书将在浏览器中失效。
在续费时,客户将无法从被拒绝的CA获取新证书,因而可以转向新的CA。借助SCTNotAfter,客户在截止日期后的整个证书生命周期内都有时间计划过渡到新的CA。一旦在SCTNotAfter日期之前颁发的每一个证书到期,被拒绝信任的CA就可以安全地从根存储中移除。
在发生安全事件或密钥泄露时,SCTNotAfter日期可以设定为过去的时间。假设我们在时间T时得知诚实的Achmed的CA在时间P时被攻击,其中P早于T。那么设定SCTNotAfter日期为P-1,允许所有在被攻击之前颁发的现有证书继续其剩余生命周期,同时限制拒绝信任只针对攻击后颁发的证书。这使得尽可能多的证书继续有效,同时阻止任何潜在恶意的证书。
Chrome对GLOBALTRUST和Entrust的拒绝信任都采用了SCTNotAfter,与Symantec的拒绝信任不同,前两者没有导致意外的用户证书错误提示。这为用户安全和体验提供了改善。尽管拒绝信任有时是必要的,但用户安全的最佳结果是一个健全的Web PKI,所有CA和浏览器都致力于持续改进用户安全。在所有参与方共同致力于用户安全的情况下,拒绝信任的事件非常少见。