Skip to content

工作流:多层 PKI 生命周期

场景:从零为一套内部系统搭建完整的私有 PKI 层级,覆盖签发、吊销、验证全生命周期。

适用边界

  • ✅ 内部 CA 供给、企业私有 PKI、开发/测试环境证书签发
  • ❌ 公网公开可信 CA(需通过 CA/Browser Forum 审计,非工具能及)
  • ❌ 已有商业 CA 体系,仅需签发叶子证书(直接用 sign-cert 即可)

五步流程

Step 1 — 生成根 CA

根 CA 自签名,私钥离线保管,仅在签发中间 CA 时取出。

bash
cert-skills generate \
  --common-name "My Root CA" --is-ca \
  --validity-days 3650 --key-size 4096 \
  --output-cert root.pem --output-key root-key.pem

要点:--is-ca 自动设 KeyUsage = CertSign | CRLSign | DigitalSignature

根 CA 私钥必须离线保管

根私钥一旦泄露,整个 PKI 信任体系崩塌——所有由它签发的证书都得吊销重签。把 root-key.pem 存在离线介质(HSM / 加密 USB / 保险柜),仅在签发中间 CA 时取出。

Step 2 — 生成中间 CA

中间 CA 由根 CA 签发,是日常签发的"代理人"。

bash
cert-skills generate-intermediate-ca \
  --parent-cert root.pem --parent-key root-key.pem \
  --common-name "My Intermediate CA" \
  --validity-days 1825 --path-len 0 \
  --output-cert int.pem --output-key int-key.pem

要点:--path-len 0 表示该中间 CA 只能签叶子证书,不能再签中间 CA——这是企业 PKI 的常见约束,防止签发权被滥用。

为什么默认 pathLen=0

企业 PKI 的分层原则是"签发权随层级递减"。中间 CA 只负责给业务签叶子证,不允许再开下级中间 CA——一旦下级能再签中间,等于签发权失控。--path-len 0 是这个原则的硬约束。详见 多层 PKI 与 pathLen

Step 3 — 签发叶子证书

bash
cert-skills sign-cert \
  --ca-cert int.pem --ca-key int-key.pem \
  --common-name app.example.com \
  --dns-names app.example.com,api.example.com \
  --key-usage server --validity-days 365 \
  --output-cert app.pem --output-key app-key.pem

要点:叶子证书带 ServerAuth ExtKeyUsage,不带 CertSign——它不能签别的证。

Step 4 — 吊销被攻陷的叶子证书并发布 CRL

假设 app.pem 私钥泄露,序列号为 123456

bash
cert-skills generate-crl \
  --ca-cert int.pem --ca-key int-key.pem \
  --serials 123456 --reasons key-compromise \
  --next-update 30 --crl-output crl.pem

要点:原因码 key-compromise 对应 RFC 5280 码 1。CRL 用中间 CA 签发(中间 CA 有 CRLSign)。

CRL 必须用签发该证书的 CA 来吊销

叶子证书由哪个 CA 签发,就只能由那个 CA 的私钥签 CRL。中间 CA 签的叶子用中间 CA 签 CRL;根 CA 签的中间用根 CA 签 CRL。混用会验签失败。

Step 5 — 验证证书链

bash
cert-skills verify-chain app.example.com
# 或验证本地文件
cert-skills verify-chain ./app.pem

校验:叶子 → 中间 → 根一路签名有效、未过期、pathLen 不越界、根在信任库。

阶段产出

反模式

  • 🚫 根 CA 私钥放在签发服务器上——应离线(HSM/离线介质)保管。
  • 🚫 中间 CA 不设 pathLen——等于授权无限嵌套签发权。
  • 🚫 用根 CA 直接签叶子证书——增加根私钥暴露面,违背"根离线"原则。
  • 🚫 吊销后不发 CRL 或不更新 NextUpdate——校验方拿不到最新吊销状态。
  • 🚫 CRL 不验签就信——CRL 本身可能被篡改,必须 CheckSignatureFrom(CA)

下一步