防止CA滥用职权——证书透明度(Certificate Transparency)
0. 前言
0.1. PKI 系统
PKI(Public Key Infrastructure,公钥基础设施)是一种基于公钥加密技术的安全体系结构,用于确保数据在传输过程中的安全性。PKI 体系结构包括证书颁发机构(CA)、注册机构(RA)、证书吊销列表(CRL)和证书库等组成部分。可以说,PKI 是保证网络安全的基础。
0.2. 原 PKI 系统的问题
PKI 系统可以有效防止中间人的攻击,但是这是建立在 CA 是可信的基础上的。然而,CA 也可能滥用职权,签发不安全的证书,从而导致中间人攻击。
最经典的就是 2011 年,荷兰的数字证书机构 DigiNotar 被入侵者利用其基础设施成功创建了超过 500 个欺诈性数字证书。最终,DigiNotar 宣告破产。
还有就是 2015 年,某国的互联网络信息中心被发现其子 CA 签发了 Google 的假证书,导致此 CA 被 Chrome、Firefox 等浏览器撤销信任。
0.3. 此问题的解决方案
Ben Laurie 和 Adam Langley 提出了证书透明度(Certificate Transparency,CT)的概念。这个行为是为了解决 CA 滥用职权的问题。
1. 证书透明度
1.1. 什么是证书透明度
CT 是一种公共日志系统,用于记录 CA 签发的 SSL 证书。这些日志是公开的,任何人都可以查看。这样一来,如果 CA 滥用职权,签发了本不应该签发的证书,那么这个证书就会被发现。
1.2. CT 的工作原理
CT 的工作原理如下:
1. 网站持有者向 CA 申请证书
这个步骤是域名持有者向 CA 申请证书。
2. CA 生成一份预证书(Pre-Certificate)
此时,CA 会先验证这个请求者是否有权利申请这个域名的证书。如果验证通过,CA 会生成一份预证书(Pre-Certificate)。
所谓的预证书,就是将要颁布的证书,其含有将要颁布证书的全部信息,不过他有一个额外的扩展,被称为毒扩展(Poison Extension)。这个扩展会告诉浏览器,这个证书是一个预证书,不是一个正式的证书,不能作为浏览器访问网站使用的 SSL 证书。
这样做的目的是为了阻止以下的死循环。
即:CA 想要登记实际要颁布的证书,那么这个证书需要有一个证书签名时间戳(Signed Certificate Timestamp,SCT)。但是获得 SCT 则又需要去登记这个证书,这样就会陷入死循环。
3. CA 将预证书提交到 CT 日志服务器
任何人都可以将证书提交到 CT 日志服务器,但大部分情况下提交者为 CA。
4. 将预证书加入日志(logs)
日志保存了所有提交的证书记录,日志具有以下特性:
- 只能添加:证书只能添加到日志,不能删除,修改或者插入
- 加密保证:日志使用哈希树(Merkle Tree)来保证证书的完整性,防止篡改
- 可公开审查:任何人都可以查询日志并验证其是否存在问题,或者验证 SSL 证书或预证书是否在日志中。
哈希树,是一种简单的二叉树,具有叶子(leaves)和节点(nodes)。在 CT 中,叶子是已经添加到日志中一个整数的哈希值。节点是成对的叶子或成对的其他节点的哈希值。最源头的节点,也就是根节点,他的哈希值就可以代表整颗树的哈希值。
演示图如下(来自 Cloudflare):

CT 日志服务器会定期的为根节点签名,形成一个签名树头(Signed Tree Head,STH)。这样就完成了对该树上所有证书的签名。
5. CT 日志服务器返回 SCT 给 CA
一般来说,每次记录的证书都会立刻返回一个 SCT,并且承诺在最大合并时间(Maximum Merge Delay,MMD)内将证书加入到日志中。
CA 会使用 X.509v3 扩展将 SCT 添加到证书中。(还有两种不常见的方式:TLS extension 和 OCSP stapling)
6. CA 将证书发送给域名持有者
CA 将证书发送给域名持有者,域名持有者将证书安装到服务器上。
7. 浏览器验证证书
假设此时有人访问了这个网站,例如 Chrome 或者 Safari,浏览器会验证 SCT 信息。每种浏览器对于 SCT 的要求不同,例如 Chrome 和 Safari 要求至少有两个 SCT。
8. 日志受到监督
CT 日志服务器会受到监督,这个监督是公开运行的服务器,他们会定期联系所有日志服务器,监视可疑证书。当然,个人也可以监视日志服务器。
1.3. 流程图

2. 证书透明度现状
2.1. Chrome 强制要求 CT
根据 Google 的文档,于 2018.4.30 后颁布的证书,都需要有 CT 扩展,否则被认为是不安全的。
3. 证书透明度细节
3.1. 自签名证书的证书透明度
根据 Google 的文档,只有公开的 CA 才需要遵守 CT 规则,所以自签名证书不需要遵守 CT 规则。