这是一篇关于 Web 公钥基础设施(PKI)中 TLS 证书撤销的文章,主要内容如下:
- 引言:TLS 证书有效期长,攻击者可长期利用 compromised 证书,证书撤销可解决此问题,但 Web PKI 中有数十亿客户端,CA 知道何时撤销证书容易,告知客户端忽略 compromised 证书难,介绍了三种撤销方法(CRLs、OCSP、短寿命证书)及其演变,作者将重点介绍客户端总结的 CRLs 并提议提供六周证书。
- 动机:2023 年 8 月 CA/Browser Forum 投票赞成 Ballot SC-064 v4,让 OCSP 可选,Let's Encrypt 宣布有意在 2025 或 2026 年底关闭 OCSP 服务,大多数网站将失去 OCSP,需要寻找其他解决方案,文章以 ACME 为中心,推荐Intro to TLS certificates供不熟悉的读者阅读。
- 证书撤销列表(CRLs):CA 定期发布已撤销证书的列表,OCSP 是轻量级替代方案,但 CRLs 仍有作用,最近才加入 CA/Browser Baseline Requirements。
在线证书状态协议(OCSP):
- 性能问题:询问 CA 关于新证书的状态会降低页面加载速度。
- 隐私问题:会泄露域名给 CA。
- CA 可靠性问题:CA 需要良好的正常运行时间并响应大量请求。
- 健壮性问题:防火墙或连接问题可能导致 OCSP 检查失败,攻击者可阻止连接使客户端信任 compromised 证书。
- OCSP Stapling 和 Must-Staple:通过证书扩展解决性能、隐私和 CA 可靠性问题,但 Must-Staple 采用率低。
- OCSP Expect-Staple:将 HSTS 的概念应用于 OCSP Must-Staple,但未得到广泛采用,Chromium 后来停止了对其的支持。
- 实现问题:流行的 Web 服务器对 stapling 的支持不佳。
- 查询 CRL 分片:为解决客户端无法直接查询和更新大型 CRLs 的问题,CA 可将 CRLs 分区为较小的“分片”,OCSP 启用的证书包含 OCSP URL 供客户端提交查询,但下载分片的隐私优势有限,CA 认为此解决方案比 OCSP 更容易,但不能解决 OCSP 的大多数问题。
客户端总结的 CRLs:
- Google 的方法:CRLSets 最初只包含一小部分证书,后来扩展到涵盖某些撤销原因,但仍不能覆盖所有撤销事件。
- Mozilla 的方法:CRLite 使用 Bloom 过滤器压缩证书撤销列表,具有零错误率和小存储 footprint,但对于某些客户端来说仍过大。
- Apple 的方法:valid.apple.com 采用类似 CRLite 的方法,减少了 live OCSP 查询,但作者不熟悉其详细方法。
- 总结的 CRLs 的缺点:对于小型客户端来说不太适用,需要操作系统管理的总结 CRL,对于短寿命的服务器来说获取实时更新的压缩总结 CRL 可能需要云供应商的努力,短寿命证书可能是更好的选择。
- Let's Revoke:提出将所有活动和撤销的证书以高度压缩的形式推送给客户端,需要 CA 的更改,能够更好地扩展,但获取所有 CA 的支持将很困难。
- ACME 续约信息(ARI):ACME Renewal Information 用于通知服务器的 ACME 客户端证书需要更新,与其他撤销检查互补。
- 短寿命证书:将证书寿命缩短至一周以下可减少撤销问题,短寿命证书带来一些挑战,如 webmasters 需要设置监控和备份 CA,CA 需要更频繁地颁发证书和提高可用性,ACME-STAR 和 delegated credentials 是缩短证书信任寿命的尝试。
作者的提议:
- 消除单点故障:使用 Signed HTTP Exchanges(SXGs)来分发 CRLs 或 CRL 分片,以减轻单点故障的影响。
- 强制短期证书:CAAs 记录应限制颁发长期证书,并使用 HTTPS RR 或客户端预加载列表来防止信任长期 compromised 证书。
- 渐进式更改:缩短长期证书的寿命:每周减少证书的平均寿命,从三个月缩短至六周,鼓励 webmasters 设置警报系统,减少撤销列表的大小。
- 结论:OCSP 即将退出,未来在于使用分片的 CRLs、总结的 CRLs 和短寿命证书,短寿命证书更强大,但需要更好的工具,目前大多数非浏览器客户端缺乏撤销解决方案,Firefox 在某些方面领先于 Chromium,但在证书透明度方面仍有不足。
- 脚注:对文中提到的一些概念和细节进行了补充说明,如攻击者 compromise 证书的方式、不同浏览器对各种撤销方法的支持情况等。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。