基于 HashiCorp Vault 的 PKI 证书体系构建与使用指南

·

一、总体架构设计

本方案采用标准分层 PKI 架构:

Root CA(根证书)
├── LAN Intermediate CA(内网)
└── WAN Intermediate CA(外网)

设计原则

  1. Root CA 仅用于签发中间 CA
  2. 所有业务证书由中间 CA 签发
  3. 内外网证书逻辑隔离
  4. 客户端仅信任 Root CA

二、PKI 引擎初始化

2.1 创建 Root CA 挂载点

vault secrets enable -path=pki_root pki
vault secrets tune -max-lease-ttl=87600h pki_root

说明:

  • 87600h ≈ 10 年(根证书有效期)

2.2 生成 Root CA

vault write pki_root/root/generate/internal \
  common_name="Homelab Root CA" \
  issuer_name="root-issuer" \
  ttl=87600h

说明:

  • common_name:证书显示名称
  • issuer_name:Vault 内部标识

三、中间 CA 构建


3.1 创建 LAN 中间 CA

创建挂载点

vault secrets enable -path=pki_int_lan pki
vault secrets tune -max-lease-ttl=43800h pki_int_lan

生成 CSR

vault write -format=json pki_int_lan/intermediate/generate/internal \
  common_name="LAN Intermediate CA" \
  issuer_name="lan-issuer" \
  ttl=43800h \
  | jq -r '.data.csr' > /tmp/pki_int_lan.csr

使用 Root CA 签发

vault write -format=json pki_root/root/sign-intermediate \
  csr=@/tmp/pki_int_lan.csr \
  format=pem_bundle \
  ttl=43800h \
  | jq -r '.data.certificate' > /tmp/pki_int_lan.cert.pem

导入中间证书

vault write pki_int_lan/intermediate/set-signed \
  certificate=@/tmp/pki_int_lan.cert.pem

3.2 创建 WAN 中间 CA

流程与 LAN 相同,仅路径不同:

pki_int_wan

四、配置证书签发策略(Role)


4.1 内网证书策略

vault write pki_int_lan/roles/lan-server \
  allowed_domains="home.arpa,example.internal" \
  allow_subdomains=true \
  allow_bare_domains=true \
  allow_ip_sans=true \
  key_type=rsa \
  key_bits=2048 \
  max_ttl=26280h

说明:

  • 26280h ≈ 3 年
  • 支持 IP SAN

4.2 外网证书策略

vault write pki_int_wan/roles/wan-server \
  allowed_domains="example.com" \
  allow_subdomains=true \
  allow_ip_sans=false \
  max_ttl=26280h

五、证书签发流程


5.1 单个证书签发

vault write -format=json pki_int_lan/issue/lan-server \
  common_name="host.home.arpa" \
  alt_names="host.home.arpa" \
  ip_sans="192.168.1.10" \
  ttl=26280h > cert.json

5.2 提取证书文件

jq -r '.data.certificate' cert.json > cert.pem
jq -r '.data.private_key' cert.json > privkey.pem
jq -r '.data.ca_chain[]' cert.json > chain.pemcat cert.pem chain.pem > fullchain.pem

六、批量签发脚本(示例)

#!/usr/bin/env bash
set -eNAME="$1"
DNS="$2"
IP="$3"
TTL="${4:-26280h}"vault write -format=json pki_int_lan/issue/lan-server \
  common_name="$NAME" \
  alt_names="$DNS" \
  ip_sans="$IP" \
  ttl="$TTL" > "$NAME.json"jq -r '.data.certificate' "$NAME.json" > cert.pem
jq -r '.data.private_key' "$NAME.json" > privkey.pem<br>jq -r '.data.ca_chain[]' "$NAME.json" > chain.pemcat cert.pem chain.pem > fullchain.pem

七、证书验证


7.1 使用 Root CA 验证链

vault read -field=certificate pki_root/cert/ca > root.pemopenssl verify \
  -CAfile root.pem \
  -untrusted chain.pem \
  cert.pem

7.2 查看证书内容

openssl x509 -in cert.pem -noout -subject -issuer -dates<br>openssl x509 -in cert.pem -noout -ext subjectAltName

八、证书链构建


8.1 构建 CA Full Chain

cat intermediate.pem root.pem > ca-fullchain.pem

说明:

  • 顺序必须为:中间 CA → Root CA

8.2 服务端使用

服务端需配置:

fullchain.pem(证书 + 中间 CA)
privkey.pem

九、客户端信任配置


9.1 导出 Root CA

vault read -field=certificate pki_root/cert/ca > root-ca.pem

9.2 Windows 客户端

导入至:

受信任的根证书颁发机构

9.3 Linux 客户端

cp root-ca.pem /usr/local/share/ca-certificates/<br>update-ca-certificates

十、关键设计要点总结


10.1 信任模型

  • 客户端仅信任 Root CA
  • 中间 CA 由服务器提供
  • 必须使用完整证书链

10.2 安全建议

  1. Root CA 不参与日常签发
  2. 内外网 CA 分离
  3. 控制证书有效期
  4. 使用 SAN 替代 CN

10.3 常见问题

问题原因
浏览器提示不安全未导入 Root CA
证书链不完整未使用 fullchain
IP 访问失败未设置 ip_sans
签发失败超过 max_ttl

十一、总结

该方案实现:

  • 标准化 PKI 架构
  • 可扩展的证书管理体系
  • 内外网证书隔离
  • 与主流系统兼容

如需进一步扩展,可考虑:

  • 自动化签发(ACME 风格)
  • 证书自动续期
  • 与反向代理集成
  • 与目录服务集成(如统一信任分发)

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注