Skip to content

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场景
serverServerAuthHTTPS 网站
clientClientAuthmTLS 客户端证书
bothServerAuth + ClientAuth双用途

叶子证书不会CertSign——只有 CA 能签证书。

签发一张证书需要做的决策:

4. 生成 CSR(可选)

如果不直接签发,而是要走正规 CSR 流程(让别的 CA 签):

bash
cert-skills generate-csr --common-name app.example.com --dns-names app.example.com

CSR 模式更安全

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

下一步