工作流:多层 PKI 生命周期
场景:从零为一套内部系统搭建完整的私有 PKI 层级,覆盖签发、吊销、验证全生命周期。
适用边界
- ✅ 内部 CA 供给、企业私有 PKI、开发/测试环境证书签发
- ❌ 公网公开可信 CA(需通过 CA/Browser Forum 审计,非工具能及)
- ❌ 已有商业 CA 体系,仅需签发叶子证书(直接用
sign-cert即可)
五步流程
Step 1 — 生成根 CA
根 CA 自签名,私钥离线保管,仅在签发中间 CA 时取出。
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 签发,是日常签发的"代理人"。
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 — 签发叶子证书
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:
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 — 验证证书链
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)。
下一步
- pathLen 编码细节 → 多层 PKI 与 pathLen
- CRL 编码 → CRL 生成与编码
- 单步命令手册 → PKI 与证书签发