Skip to content

CRL 吊销列表

证书被攻陷或私钥泄露后,CA 需要发布一份"已吊销证书清单",让校验方拒绝这些证书。这就是 CRL(Certificate Revocation List),规范在 RFC 5280。

证书吊销的两种机制

cert-skills 同时支持两种:generate-crl / parse-crl 管 CRL,check-revocation 同时查 OCSP + CRL。本页聚焦 CRL 生成与解析。

CRL vs OCSP 怎么选
维度CRLOCSP
时效有发布延迟(CA 定期发布)实时
网络可离线(下载一次查多张)必须在线查每张
隐私不暴露查询行为暴露给 CA(你在查谁)
可用性依赖低(本地有 CRL 即可)高(responder 挂了就查不到)
cert-skills 命令generate-crl / parse-crlcheck-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.pem

RFC 5280 吊销原因码

--reasons 必须用规范化的原因名,对应 RFC 5280 §5.3.1 的数字编码:

原因名含义
unspecified0未指定(默认)
key-compromise1私钥泄露
ca-compromise2CA 私钥泄露
affiliation-changed3主体从属关系变更
superseded4已被新证书取代
cessation-of-operation5停止运营
certificate-hold6暂时挂起
remove-from-crl8从 CRL 移除(7 缺省,RFC 未分配)
privilege-withdrawn9撤销权限
aa-compromise10AA 私钥泄露

原因码选错的后果

原因码影响客户端行为: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 里(按序列号字符串比对)。

吊销流程串起来

下一步