# 预证书（Precertificate）是什么？

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

Source: https://ssl.sh/zh/glossary/precertificate/
Last updated: 2026-11-10

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

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

## 例子
```bash
openssl x509 -in precert.pem -noout -text | grep -A1 "Poison"
```

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

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

## 相关术语

- [证书透明度](https://ssl.sh/zh/glossary/certificate-transparency/): 证书透明度（CT）是一套公开、只可追加的日志系统，记录所有公开信任的 TLS 证书，让任何人都能审计 CA 签发了什么。
- [SCT](https://ssl.sh/zh/glossary/sct/): SCT 是 CT 日志签发的承诺凭证，表示它会把某张证书收录进公开日志，浏览器以此确认证书已提交记录。
- [CT 日志](https://ssl.sh/zh/glossary/ct-log/): CT 日志是由独立运营方维护、可公开审计且只可追加的服务器，用 Merkle 树记录证书，并签发承诺收录的时间戳。
- [X.509](https://ssl.sh/zh/glossary/x509/): X.509 是 ITU-T 制定的公钥证书标准格式，其互联网配置规范 RFC 5280 规定了 TLS 所用证书的结构和验证方法。
- [错误签发](https://ssl.sh/zh/glossary/misissuance/): 错误签发是指 CA 违反 Baseline Requirements 或根证书计划政策签发证书，从验证缺陷到字段格式错误都算在内。
- [证书颁发机构](https://ssl.sh/zh/glossary/certificate-authority/): 证书颁发机构（CA）是负责审核申请者、签发数字证书，并把公钥与域名或身份绑定在一起的机构。
