在开发测试环境中,我们经常需要为内部服务配置HTTPS加密。虽然Let's Encrypt等公共CA提供免费证书,但在以下场景中自建CA更具优势:
我曾为某电商平台搭建压力测试环境,需要为200+个微服务实例配置HTTPS。使用自建CA后,整个证书签发流程从3天缩短到2小时。下面分享我的实战经验。
首先创建CA目录结构,这是保持证书管理清晰的关键:
bash复制mkdir -p ~/myca/{certs,private,newcerts,crl}
cd ~/myca
touch index.txt
echo 1000 > serial
生成加密的CA私钥(建议使用4096位密钥):
bash复制openssl genrsa -aes256 -out private/ca.key 4096
这里会提示输入密码,建议使用12位以上包含特殊字符的强密码。我遇到过因密码太简单导致私钥被破解的案例,后果是整个CA体系需要推倒重建。
生成有效期10年的根证书(生产环境建议不超过5年):
bash复制openssl req -x509 -new -key private/ca.key -days 3650 \
-out certs/ca.crt -subj "/C=CN/O=My Corp/CN=My Root CA"
关键参数说明:
-x509:直接生成自签名证书-subj:建议至少包含国家(O)、组织(C)和通用名(CN)生成的ca.crt需要分发给所有需要验证服务端证书的设备。在Linux系统中可以这样安装:
bash复制sudo cp certs/ca.crt /usr/local/share/ca-certificates/
sudo update-ca-certificates
为web服务生成密钥对(推荐使用ECC算法):
bash复制openssl ecparam -genkey -name prime256v1 -out private/web.key
创建CSR时特别注意CN字段:
bash复制openssl req -new -key private/web.key -out web.csr \
-subj "/C=CN/O=My Corp/OU=Dev/CN=test.example.com"
易错点:
*.example.com格式使用以下命令签发有效期为1年的证书:
bash复制openssl ca -policy policy_anything -md sha256 -days 365 \
-in web.csr -out certs/web.crt -cert certs/ca.crt \
-keyfile private/ca.key -extensions SAN \
-config <(cat /etc/ssl/openssl.cnf \
<(printf "[SAN]\nsubjectAltName=DNS:test.example.com"))
关键扩展参数:
-extensions SAN:启用主题备用名称-md sha256:指定签名哈希算法policy_anything:允许签发非严格匹配的证书| 格式 | 编码方式 | 典型扩展名 | 特点 |
|---|---|---|---|
| PEM | ASCII | .pem/.crt | 可读性强,支持证书链 |
| DER | 二进制 | .der/.cer | 体积小,适合Java环境 |
| PKCS#7 | ASCII | .p7b | 专用于证书链传输 |
| PKCS#12 | 二进制 | .pfx/.p12 | 包含私钥和证书链,需密码保护 |
PEM转DER格式:
bash复制openssl x509 -in certs/web.crt -outform DER -out web.der
打包PKCS12格式(含私钥):
bash复制openssl pkcs12 -export -inkey private/web.key \
-in certs/web.crt -certfile certs/ca.crt -out web.p12
我曾遇到Windows IIS必须使用PFX格式的情况,而Nginx则需要PEM格式,掌握这些转换技巧能节省大量时间。
bash复制openssl x509 -in certs/web.crt -noout -enddate
bash复制openssl ca -revoke certs/web.crt -keyfile private/ca.key -cert certs/ca.crt
bash复制openssl ca -gencrl -out crl/ca.crl -keyfile private/ca.key -cert certs/ca.crt
在金融级项目中,我们采用三级CA体系:离线根CA → 在线中间CA → 签发CA。即使签发CA被入侵,也能快速重建而不影响整个体系。