nginx配置交叉签名证书链的核心是严格按“域名证书→交叉中间证书→原始中间证书”顺序拼接pem文件,排除所有根证书;nginx不识别交叉签名概念,仅依字节序验证信任路径。

交叉签名证书链在 Nginx 中的配置,核心不是“特殊处理交叉签名”,而是**确保最终拼接出的 ssl_certificate 文件严格符合 PEM 链顺序规范**:域名证书 → 交叉中间证书 → 原始中间证书(不含根证书)。Nginx 本身不识别“交叉签名”概念,只按字节流顺序验证信任路径。
理解交叉签名证书链的结构
交叉签名常见于新旧根证书过渡期(如 Let’s Encrypt ISRG Root X1 → DST Root CA X3 交叉链),目的是让旧系统(尚未内置新根)也能通过已有的老根完成验证。典型链结构为:
- 你的域名证书(leaf)
- 交叉签名的中间证书(由老根签发,用于桥接)
- 原始中间证书(由新根签发,通常也包含在包中)
- 不包含任何根证书(DST Root CA X3、ISRG Root X1 等均需排除)
例如,Let’s Encrypt 提供的 fullchain.pem 在某些版本中已自动包含交叉链;而 DigiCert 或 Sectigo 的交叉包可能需手动识别并排序。
正确拼接交叉链 PEM 文件
关键在于顺序不能颠倒,且必须剔除根证书。操作步骤如下:
- 用文本编辑器或
cat -n查看各证书文件,确认每段以-----BEGIN CERTIFICATE-----开头、-----END CERTIFICATE-----结尾 - 提取并验证交叉链组成:运行
openssl crl2pkcs7 -nocrl -certfile bundle.pem | openssl pkcs7 -print_certs -noout可列出所有证书及其颁发者,帮助识别哪一个是交叉中间体 - 按“域名证书 → 交叉中间 → 原始中间”顺序拼接(注意:不是“原始中间 → 交叉中间”)
- 示例命令:
cat example.com.crt cross-intermediate.crt regular-intermediate.crt > ssl-bundle.pem
Nginx 配置要点与验证
配置本身与普通证书无异,但验证环节更关键:
-
ssl_certificate指向拼接好的ssl-bundle.pem -
ssl_certificate_key指向对应私钥(无密码、权限为600) - 务必禁用根证书:若误将根证书写入
ssl-bundle.pem,Nginx 不报错,但客户端可能因冗余根触发校验异常 - 验证是否生效:
openssl s_client -connect your-domain.com:443 -showcerts 2>/dev/null | openssl x509 -noout -text | grep "Issuer\|Subject"
检查输出中证书层级是否连贯,且末级 Issuer 匹配你系统/浏览器已信任的根(如 DST Root CA X3)
常见错误与规避方式
交叉链配置失败,90% 出现在拼接环节:
- 顺序反了:把原始中间放前面、交叉中间放后面 → 客户端无法从 leaf 追溯到可信根
-
混入根证书:尤其商业 CA 提供的 ZIP 包常含
root.crt,直接cat *.crt > bundle.pem极易引入 -
证书格式损坏:Windows 编辑器保存为 UTF-8 BOM 或 CRLF 换行,导致 Nginx 加载失败(用
file bundle.pem确认是 ASCII text) -
忽略私钥匹配:交叉链不影响私钥,但必须确保
ssl_certificate_key对应的是签发该域名证书的私钥(可用openssl x509 -noout -modulus -in cert.pem | openssl md5与openssl rsa -noout -modulus -in key.pem | openssl md5核对)











