CRL 吊销列表
证书被攻陷或私钥泄露后,CA 需要发布一份"已吊销证书清单",让校验方拒绝这些证书。这就是 CRL(Certificate Revocation List),规范在 RFC 5280。
证书吊销的两种机制
cert-skills 同时支持两种:generate-crl / parse-crl 管 CRL,check-revocation 同时查 OCSP + CRL。本页聚焦 CRL 生成与解析。
CRL vs OCSP 怎么选
| 维度 | CRL | OCSP |
|---|---|---|
| 时效 | 有发布延迟(CA 定期发布) | 实时 |
| 网络 | 可离线(下载一次查多张) | 必须在线查每张 |
| 隐私 | 不暴露查询行为 | 暴露给 CA(你在查谁) |
| 可用性依赖 | 低(本地有 CRL 即可) | 高(responder 挂了就查不到) |
| cert-skills 命令 | generate-crl / parse-crl | check-revocation(含 OCSP) |
| 折中方案 | — | OCSP Stapling(服务器预取附带) |
生成 CRL
bash
cert-skills generate-crl \
--ca-cert int.pem --ca-key int-key.pem \
--serials 123456,789012 \
--reasons key-compromise,cessation-of-operation \
--next-update 30 \
--number 1 \
--crl-output crl.pemRFC 5280 吊销原因码
--reasons 必须用规范化的原因名,对应 RFC 5280 §5.3.1 的数字编码:
| 原因名 | 码 | 含义 |
|---|---|---|
unspecified | 0 | 未指定(默认) |
key-compromise | 1 | 私钥泄露 |
ca-compromise | 2 | CA 私钥泄露 |
affiliation-changed | 3 | 主体从属关系变更 |
superseded | 4 | 已被新证书取代 |
cessation-of-operation | 5 | 停止运营 |
certificate-hold | 6 | 暂时挂起 |
remove-from-crl | 8 | 从 CRL 移除(7 缺省,RFC 未分配) |
privilege-withdrawn | 9 | 撤销权限 |
aa-compromise | 10 | AA 私钥泄露 |
原因码选错的后果
原因码影响客户端行为:certificate-hold 表示可恢复(后续可 remove-from-crl);其它码一旦写进 CRL 就是永久吊销。把 key-compromise 误写成 unspecified 会让下游安全产品无法正确分级响应。
RFC 5280 惯例:unspecified 时省略扩展
当原因码为 unspecified(0) 时,cert-skills 会省略 reasonCode 扩展而不是写成 0——这符合 RFC 5280 "unspecified 不应显式携带"的惯例。详见 CRL 生成与编码。
前置条件
- CA 证书的
KeyUsage必须含CRLSign(生成 CA 时--is-ca会自动带上)。 - CA 证书与私钥必须配对(
keyMatchesCert会校验)。 - 支持 RSA / ECDSA / Ed25519 三种 CA 密钥。
解析 CRL
bash
cert-skills parse-crl crl.pem
cert-skills parse-crl crl.pem -o json输出:签发者、ThisUpdate / NextUpdate、CRL Number、签名算法、已吊销条目列表(序列号 + 吊销时间 + 原因)。同时支持 PEM 和 DER 输入。
验证 CRL 签名
CRL 本身是 CA 签名的,可以验证它没被篡改、确实由声称的 CA 签发:
go
// pkg 内部
err := crl.CheckSignatureFrom(caCert)parse-crl 也会展示签名信息。配合 CheckCertRevokedByCRL(cert, crl) 可判断某张证书是否在 CRL 里(按序列号字符串比对)。
吊销流程串起来
下一步
- CRL 编码细节 → CRL 生成与编码
- 在线吊销查询(OCSP + CRL)→ 吊销与 HSTS
- 完整 PKI 生命周期里 CRL 的位置 → 多层 PKI 工作流