术语表

预证书 (Precertificate)

最后核实

定义

预证书是 CA 在正式签发前提交到 CT 日志的证书副本,带有“毒化”扩展而无法使用,用来换取 SCT。

预证书由 RFC 6962 定义,内容与 CA 准备签发的正式证书完全相同,只是多了一个标记为关键(critical)的 CT Precertificate Poison(“毒化”)扩展,普通客户端遇到它会直接拒绝。CA 把预证书提交给 CT 日志,拿到返回的 SCT 后,再把这些 SCT 写进扩展字段,签发正式证书。这样就解决了“证书无法包含针对自己的时间戳”这个先有鸡还是先有蛋的问题。

为什么重要

把 SCT 嵌入证书是满足浏览器 CT 要求最常见的方式,服务器端无需任何配置。根证书计划还把日志中的预证书视为 CA 打算签发对应证书的证据:如果预证书本身违规,即使正式证书从未签发或从未记入日志,也算错误签发。因此在 CT 检索结果里,同一张证书常常出现两条记录:一条是预证书,一条是正式证书。

例子

openssl x509 -in precert.pem -noout -text | grep -A1 "Poison"

预证书会显示 CT Precertificate Poison: critical。正式证书没有这个扩展,而是显示 CT Precertificate SCTs:,后面列出收集到的日志 ID 和时间戳。

常见误区

  • CT 里有两条记录,说明 CA 签了两张证书。 通常一条是预证书,一条是正式证书,两者序列号相同。
  • 预证书可以部署到服务器上。 毒化扩展被标记为关键扩展,客户端会拒绝它。
  • 正式证书也必须记入日志。 不一定:记入预证书并把 SCT 嵌进正式证书就能满足浏览器要求,只是有些 CA 两者都会提交。

延伸阅读