跳转到主要内容

证书透明度

本文约需 2 分钟阅读

证书透明度 (Certificate Transparency, CT) 是一种将所有 SSL/TLS 证书的签发都记录到公开日志中、使任何人都能审计的机制。其目的是当证书颁发机构 (CA)签发了不正当的证书时,域名所有者和浏览器厂商能够迅速察觉。Google 的工程师 Ben Laurie 和 Adam Langley 于 2013 年以 RFC 6962 提出,如今以 Chrome 为首的主流浏览器都将支持 CT 列为必需。

DigiNotar 事件与 CT 诞生的背景

CT 诞生的直接契机是 2011 年荷兰证书颁发机构 DigiNotar 的入侵事件。攻击者侵入了 DigiNotar 的系统,签发了包括 google.com 在内的 500 多份不正当证书。这些证书被用于针对伊朗用户的中间人攻击,据称 Gmail 的通信因此被窃听。

这一事件暴露了 PKI (公钥基础设施) 的根本弱点:任何证书颁发机构都能为任意域名签发证书,而域名所有者却无从得知。DigiNotar 因此失去信任、被迫停业,而 CT 正是作为防止同类事件再次发生的技术机制而设计的。

CT 日志的原理 - Merkle 树

CT 日志使用密码学数据结构 Merkle 树 (哈希树) 进行管理。每当有新证书加入日志时,树就会更新;一旦篡改过去的条目,就会产生哈希值不一致,从而能够立即被检测出来。

根哈希 (H1234)
H12 = hash(H1 + H2)H34 = hash(H3 + H4)
证书 1证书 2证书 3证书 4

篡改一份证书会一路连锁地影响到根哈希

CT 日志由多个独立组织 (如 Google、Cloudflare、DigiCert 等) 运营,证书颁发机构在签发证书时必须将其登记到至少两个以上的日志中。除非日志运营者相互勾结,否则要隐藏不正当证书极为困难。

SCT (Signed Certificate Timestamp) 的验证

当证书颁发机构将证书登记到 CT 日志后,日志服务器会返回一个 SCT (Signed Certificate Timestamp)。SCT 是「此证书已被记录到日志中」的密码学证明,浏览器会在 TLS 握手时验证 SCT。

CA
签发证书
CT 日志
记录 + 签发 SCT
Web 服务器
提供证书 + SCT
浏览器
验证 SCT

SCT 的传递方式有三种:将 SCT 嵌入证书本身 (X.509 v3 扩展)、通过 TLS 握手扩展发送、以及通过 OCSP Stapling 发送。以 Let's Encrypt 为首的主流证书颁发机构采用的是嵌入证书的方式。

Chrome 强制要求 CT (2018 年)

Google Chrome 自 2018 年 4 月 (Chrome 68) 起,要求所有新签发的证书都必须支持 CT。如果使用未附带 SCT 的证书建立 HTTPS 连接,Chrome 会显示安全警告。这一决定决定性地加速了 CT 的普及,如今几乎所有公共证书颁发机构都已将登记到 CT 日志纳入其标准流程。作为支撑数字证书可信度的基础,CT 已成为不可或缺的存在。

不正当证书的检测与实务应用

任何人都可以通过 crt.sh 或 Google 的 Certificate Transparency Search 搜索 CT 日志。域名管理员通过监控自己域名的证书签发情况,就能及早察觉不正当证书的签发。事实上,2017 年正是从 CT 日志中发现 Symantec 旗下的证书颁发机构曾针对 Google 的域名签发不正当的测试证书,最终导致 Symantec 的证书颁发机构业务被出售给 DigiCert。

监控 CT 日志是补充基于公钥密码的 PKI 信任模型的重要机制。也请一并参阅加密基础钓鱼防护以及浏览器密码安全等文章。

密码技术相关书籍 (Amazon) 上也能找到。

相关术语

这篇文章对您有帮助吗?

XHatena