一、总体架构设计
本方案采用标准分层 PKI 架构:
Root CA(根证书)
├── LAN Intermediate CA(内网)
└── WAN Intermediate CA(外网)
设计原则
- Root CA 仅用于签发中间 CA
- 所有业务证书由中间 CA 签发
- 内外网证书逻辑隔离
- 客户端仅信任 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 安全建议
- Root CA 不参与日常签发
- 内外网 CA 分离
- 控制证书有效期
- 使用 SAN 替代 CN
10.3 常见问题
| 问题 | 原因 |
|---|---|
| 浏览器提示不安全 | 未导入 Root CA |
| 证书链不完整 | 未使用 fullchain |
| IP 访问失败 | 未设置 ip_sans |
| 签发失败 | 超过 max_ttl |
十一、总结
该方案实现:
- 标准化 PKI 架构
- 可扩展的证书管理体系
- 内外网证书隔离
- 与主流系统兼容
如需进一步扩展,可考虑:
- 自动化签发(ACME 风格)
- 证书自动续期
- 与反向代理集成
- 与目录服务集成(如统一信任分发)
发表回复