证书透明度 Certificate Transparency 是什么?它如何发现误签证书?
简化版
证书透明度,简称 CT,是一种公开记录证书签发行为的机制。
CA 签发证书后,需要把证书提交到公开 CT Log,获得 SCT 证明。浏览器可以要求证书携带 SCT,域名所有者也可以监控日志,发现是否有人为自己的域名误签或恶意签发证书。
CT 不能阻止 CA 误签发生,但能让误签更容易被发现和追责。
详细版
没有 CT 时,如果某个 CA 错误签发了 example.com 的证书,域名所有者可能很晚才知道。
CT 要求证书进入公开日志:
CA -> CT Log: 提交预证书
CT Log -> CA: 返回 SCT
CA -> 网站: 签发带 SCT 的证书
Browser -> 网站: 检查证书和 SCT
SCT 可以嵌入证书,也可以通过 TLS 扩展或 OCSP Stapling 传递。
域名所有者可以监控 CT Log,只要发现陌生证书,就立刻调查和吊销。
完整版教学
1. 先说明 CT 解决的安全盲区
HTTPS 的信任模型依赖很多根 CA 和中间 CA。
只要浏览器信任某个 CA,这个 CA 理论上就能为很多域名签发证书。
如果 CA 误签或被攻破,攻击者可能拿到某个域名的合法证书。
CT 要解决的是“证书签发行为不可见”的问题。
CT 的核心不是加密算法,而是把证书签发放到公开、可审计的日志里。
2. CT Log 是什么
CT Log 是追加式公开日志。
证书提交进去后,会形成可验证的记录。
日志系统通常使用 Merkle Tree 结构,让外部可以验证某张证书确实被记录过,也能检查日志是否被篡改。
一个简化模型:
cert1
cert2
cert3
-> Merkle Tree Root
浏览器和监控系统不需要完全信任某个单点,而是通过公开日志和加密证明进行审计。
3. SCT 是什么
SCT 全称 Signed Certificate Timestamp。
它表示某个 CT Log 承诺在规定时间内把证书加入日志。
SCT 可以通过几种方式给客户端:
- 嵌入证书本身。
- 通过 TLS 扩展发送。
- 通过 OCSP Stapling 携带。
浏览器检查证书时,也会检查是否满足 CT 策略。
4. CT 如何发现误签
域名所有者可以持续监控 CT Log。
一旦发现自己的域名出现了陌生证书,例如:
DNS:login.example.com
Issuer: Unknown CA
就可以判断是否为正常签发。
如果不是,就联系 CA 吊销证书,并调查误签原因。
CT 让“偷偷签发证书”变得更难隐藏。
5. CT 的能力边界
CT 很重要,但它不是万能拦截器。
| 能力 | 是否具备 | 说明 |
|---|---|---|
| 发现误签 | 是 | 通过日志监控发现 |
| 阻止所有误签 | 否 | 误签可能先发生 |
| 替代证书链验证 | 否 | 仍要验证 CA 链 |
| 证明证书被公开记录 | 是 | 通过 SCT 和日志证明 |
| 修复私钥泄露 | 否 | 仍需吊销和换证 |
所以 CT 更像审计和透明机制。
6. 工程实践中的监控
大型站点通常会监控自己的主域和关键子域。
例如:
example.com*.example.comlogin.example.comapi.example.com
监控发现异常后,要判断证书是否来自自己的自动化签发系统、CDN、云厂商或合作方。
如果无法解释,就要进入安全响应流程。
7. 常见误区与追问
- 误区:CT 能阻止 CA 误签。 它主要让误签可见,便于发现和追责。
- 误区:有 SCT 就说明证书一定安全。 SCT 只说明进入 CT 机制,证书链、域名、有效期仍要验证。
- 误区:CT Log 是私有日志。 它的价值在公开可审计。
- 追问:SCT 有哪些传递方式? 可以嵌入证书、通过 TLS 扩展、通过 OCSP Stapling。
- 追问:域名所有者为什么要监控 CT? 为了发现未授权证书签发。
- 追问:CT 和 OCSP 有什么区别? CT 关注签发透明,OCSP 关注证书是否被吊销。
8. 加强记忆
CT 可以记成“证书签发公告栏”:谁签了什么证书,都要留下公开记录。
它让误签不再安静地躲在黑箱里。