nginx证书链配置必须统一使用fullchain.pem文件,严格按“域名证书+中间证书”顺序拼接且不含根证书,并通过ci/cd自动校验链完整性、密钥匹配及权限合规性,确保全环境https信任链可验证、可审计、可复现。

团队开发中,Nginx 证书链配置不统一,容易导致上线后 HTTPS 失败、SSL Labs 评分低、浏览器报“不安全”或 OCSP Stapling 失效等问题。规范化不是追求“能用”,而是确保每次部署都满足生产级信任链完整性要求——核心是让证书链可验证、可审计、可复现。
统一证书链文件命名与结构
强制规定所有项目使用 fullchain.pem 作为唯一证书链加载文件,禁止直接引用域名证书(如 example.com.crt)或拼接中间证书。该文件必须严格按以下顺序拼接:
- 第一段:服务器证书(即你的域名证书)
- 第二段:全部中间证书(按签发层级从上到下,不能遗漏)
- 根证书不放入此文件(由客户端或系统信任库提供)
示例命令验证是否合规:openssl crl2pkcs7 -nocrl -certfile fullchain.pem | openssl pkcs7 -print_certs -noout —— 应输出至少两个证书(域名 + 至少一个中间)。
建立证书链校验流水线
在 CI/CD 流程中嵌入自动化校验步骤,而非依赖人工检查。例如在部署前执行:
- 检查
fullchain.pem是否包含完整链:openssl verify -CAfile - 确认私钥与证书公钥匹配:
openssl x509 -noout -modulus -in fullchain.pem | openssl md5与openssl rsa -noout -modulus -in privkey.pem | openssl md5输出一致 - 禁止私钥含密码(Nginx 不支持交互式解密):
openssl rsa -check -noout -in privkey.pem 2>/dev/null || echo "ERROR: key is encrypted"
标准化 Nginx 配置模板
在团队共享的 Nginx 配置模板中,固定以下最小安全集,禁止覆盖或省略:
-
ssl_certificate /etc/nginx/ssl/fullchain.pem;(只认这一个路径和文件名) -
ssl_certificate_key /etc/nginx/ssl/privkey.pem;(权限必须为600) -
ssl_trusted_certificate /etc/nginx/ssl/trusted-ca.pem;(仅用于 OCSP Stapling 验证,内容为系统级可信 CA 包) - 禁用
ssl_stapling_verify off等降级配置;OCSP 必须启用且验证开启
所有环境(dev/staging/prod)使用同一套指令集,差异仅限于 server_name 和证书路径变量,避免“测试能过、线上挂掉”。
证书生命周期协同管理机制
证书不是一次配置终身有效。团队需约定:
- 所有证书统一通过 ACME 客户端(如 Certbot 或 acme.sh)集中签发,自动续期脚本输出必须生成标准
fullchain.pem+privkey.pem - 更新证书后,必须触发 Nginx 重载(
nginx -t && nginx -s reload),该操作纳入发布清单 checklist - 证书到期前 30 天,CI 系统自动扫描并告警;过期证书禁止提交至配置仓库主干分支
不复杂但容易忽略











