PKI 与证书签发
从零搭建一套私有 PKI(根 CA → 中间 CA → 叶子证书 → 吊销 → 验证),cert-skills 把每一步都做成了一条命令。
生命周期全景
1. 生成根 CA
根 CA 是自签名的,私钥必须离线保管。CA 证书的关键:KeyUsage 必须含 CertSign(能签证书)和 CRLSign(能签吊销列表)。
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支持密钥类型:rsa(默认 2048/4096)、ecdsa(P-256/384/521)、ed25519。
2. 生成中间 CA
中间 CA 由根 CA 签发,是"根 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 \
--key-type rsa --key-size 4096 \
--output-cert int.pem --output-key int-key.pem关键参数 --path-len(即 pathLenConstraint):
Go x509 的 pathLen 表达陷阱
Go 的 x509 库里,表达"0"必须同时设 MaxPathLen=0 和 MaxPathLenZero=true,只设前者会被当作"未设置"(= 无限制)。这是 cert-skills 内部处理的坑,详见 多层 PKI 与 pathLen。
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--key-usage 三选一:
| 值 | ExtKeyUsage | 场景 |
|---|---|---|
server | ServerAuth | HTTPS 网站 |
client | ClientAuth | mTLS 客户端证书 |
both | ServerAuth + ClientAuth | 双用途 |
叶子证书不会带 CertSign——只有 CA 能签证书。
签发一张证书需要做的决策:
4. 生成 CSR(可选)
如果不直接签发,而是要走正规 CSR 流程(让别的 CA 签):
bash
cert-skills generate-csr --common-name app.example.com --dns-names app.example.comCSR 模式更安全
CSR 模式下私钥不落盘,只输出 CSR 文本——私钥留在生成方,不会随 CSR 文件外泄。走正规 CA 签发流程时优先用这个模式。
5. 克隆与变体(安全测试专用)
bash
# 克隆:复制 Subject + 扩展,但生成新密钥/新序列号
cert-skills clone-cert --source real.pem --modify-subject --new-cn "test.local"
# 域名变体:生成同形字/子域/TLD/连字符/插入字符的证书,用于钓鱼研究
cert-skills domain-variants --domain example.com --types homoglyph,tld仅限授权安全测试
克隆与变体会复刻真实证书的 Subject,在非授权场景下可能违法。使用前确认你有书面授权,且仅在隔离测试环境操作。详见 合规边界。
完整工作流
把上面五步串起来,就是 workflow-multi-tier-pki 技能描述的完整 PKI 生命周期。一键脚本:
bash
# 1. 根 CA
cert-skills generate -n "My Root CA" --is-ca --validity-days 3650 --key-size 4096 \
--output-cert root.pem --output-key root-key.pem
# 2. 中间 CA
cert-skills generate-intermediate-ca --parent-cert root.pem --parent-key root-key.pem \
-n "My Intermediate CA" --validity-days 1825 --path-len 0 \
--output-cert int.pem --output-key int-key.pem
# 3. 叶子证书
cert-skills sign-cert --ca-cert int.pem --ca-key int-key.pem \
-n app.example.com --dns-names app.example.com,api.example.com \
--output-cert app.pem --output-key app-key.pem
# 4. 吊销(假设 app.pem 私钥泄露,序列号 123456)
cert-skills generate-crl --ca-cert int.pem --ca-key int-key.pem \
--serials 123456 --reasons key-compromise
# 5. 验证整链
cert-skills verify-chain app.example.com下一步
- pathLen 怎么编码 → 多层 PKI 与 pathLen
- 吊销列表怎么生成 → CRL 吊销列表 / CRL 生成与编码
- 完整编排 → 多层 PKI 工作流