1. 为什么你需要私有CA每次看到浏览器里那个不安全的红色警告我就浑身难受。以前我也和大家一样用Lets Encrypt直到有次紧急发布时遇到证书续期失败整个团队熬夜排查到凌晨三点。从那天起我就开始研究用XCA搭建私有CA的方案。你可能不知道像银行、政府网站这些对安全性要求极高的机构从来不会把证书交给第三方CA管理。私有CA就像你家的私人印章想什么时候盖章就什么时候盖想盖多少就盖多少。我统计过一个20人团队如果全部使用Lets Encrypt每年至少要浪费200小时在证书管理上。2. 十分钟搭建你的证书工厂2.1 安装XCA的正确姿势别被官网那个Windows安装包骗了在Linux上编译安装才是王道。我推荐用Ubuntu 22.04这几个依赖包缺一不可sudo apt install -y libssl-dev qt5-default qttools5-dev-tools下载源码编译时记得加上这个参数避免证书存储路径出错./configure --prefix/usr/local/xca --with-openssl/usr/include/openssl make -j$(nproc) sudo make install第一次启动时你会看到一个空荡荡的界面别慌。按CtrlN新建数据库建议把密码保存在团队的1Password或Bitwarden里。我吃过亏上次把密码写在记事本里结果实习生误删了...2.2 创建根证书的魔鬼细节点击证书→新建证书这里有几个坑要避开密钥长度至少4096位2048位已经不安全了有效期别超过20年否则Chrome会报错一定要勾选CA证书选项最关键的来了在扩展选项卡里必须添加这两个OID2.5.29.19 critical,CA:TRUE 2.5.29.37 critical,1.3.6.1.5.5.7.3.1,1.3.6.1.5.5.7.3.23. 让浏览器乖乖认证书3.1 证书模板的魔法配方给内部网站签发证书时我总结出这个黄金模板主题备用名称(DNS)必须包含所有可能的域名包括*.yourcompany.local密钥用法数字签名密钥加密增强型密钥用法服务器认证客户端认证实测发现Windows系浏览器特别挑剔。你得在证书里加入CRL分发点[ v3_ca ] authorityInfoAccess issuer_info crlDistributionPoints crl_info [ issuer_info ] caIssuers;URI.0 http://pki.yourcompany.com/ca.crt [ crl_info ] URI.0 http://pki.yourcompany.com/ca.crl3.2 部署到客户端的骚操作把CA根证书导入系统信任库只是第一步。我强烈推荐用组策略(GPO)自动部署这是我们的批处理脚本certutil -f -p YourPassword -importpfx RootCA.pfx NoRoot certutil -addstore -f root RootCA.cermacOS用户更简单用Jamf或者这行命令sudo security add-trusted-cert -d -r trustRoot -k /Library/Keychains/System.keychain ca.crt4. 实战给Nginx穿上黄金铠甲4.1 一键签发脚本保存这个脚本为gen_cert.sh#!/bin/bash xca --new-cert --templateWebServer --outoutput.pem \ --dnCN$1,OYour Company \ --sanDNS:$1,DNS:*.$1 \ --passYourStrongPassword openssl pkcs12 -export -out $1.p12 -in output.pem -passin pass:YourStrongPassword -passout pass:使用时直接./gen_cert.sh api.internal.yourcompany.com三秒钟就能生成可用证书。4.2 Nginx配置的隐藏关卡大部分人只知道配置ssl_certificate其实这几个参数才是关键ssl_stapling on; ssl_stapling_verify on; ssl_trusted_certificate /path/to/your/ca-chain.crt; # 这个参数能提升10%的TLS性能 ssl_session_tickets off; ssl_buffer_size 4k;记得每周用这个命令检查证书状态openssl s_client -connect yoursite:443 -servername yoursite -showcerts | openssl x509 -noout -dates5. 高级玩家的管理技巧5.1 自动化续期流水线我在Jenkins里搭建了这个流水线每月1号自动检查所有证书距离过期30天内的证书触发续期自动推送到Ansible仓库夜间批量更新所有服务器关键是用xca的CLI模式xca --batch --passwordYourPassword --new-certtemplate.ini5.2 安全审计必备三件套证书透明度日志自己搭个CTlog服务器密钥轮换策略每季度更换一次CA密钥吊销检查OCSP响应器要7x24小时在线这个Python脚本可以检查所有证书有效性from OpenSSL import crypto import glob for cert_file in glob.glob(certs/*.pem): with open(cert_file) as f: cert crypto.load_certificate(crypto.FILETYPE_PEM, f.read()) print(f{cert_file} 过期时间: {cert.get_notAfter()})上次用这个脚本我们发现了三个被遗忘的测试证书差点造成安全事件。现在你明白为什么大厂都要自建CA了吧当你需要管理上百个证书时手动操作简直就是灾难。用XCA之后我们团队再也没为证书问题加过班新来的运维小哥还以为公司取消了SSL相关业务呢。