ssl_trusted_certificate不能补全服务端证书链,仅用于nginx内部ocsp或mtls验证;修复“证书链不完整”必须确保ssl_certificate文件严格包含域名证书+中间证书(不含根证书),顺序正确、无空行。

直接配置 ssl_trusted_certificate 并不能“指定完整的根证书链”来补全服务端对外发送的证书链——它根本不会发给浏览器或客户端。它的作用非常特定:仅在启用 OCSP stapling 或客户端证书验证(mTLS)时,供 Nginx 自身做签名验证用。
它不参与服务端证书链发送
如果你在 SSL Labs、myssl.com 或安卓微信里看到“证书链不完整”,问题一定出在 ssl_certificate 文件内容上,和 ssl_trusted_certificate 无关。后者哪怕指向一个空文件,只要 ssl_certificate 拼对了,客户端就能正常建立信任。
-
ssl_certificate→ 必须包含你的域名证书 + 所有中间证书(顺序:域名证书在前,中间证书紧随其后,之间空一行) -
ssl_trusted_certificate→ 只用于 Nginx 内部校验,应只含中间证书和根证书(不含你的域名证书),且仅在ssl_stapling on或ssl_verify_client on时生效
什么时候需要它?怎么准备文件
只有你明确启用了以下任一功能,才需要配置它:
- OCSP stapling:
ssl_stapling on;+ssl_stapling_verify on; - 双向 TLS(mTLS):
ssl_client_certificate+ssl_verify_client on;
此时,ssl_trusted_certificate 文件应严格包含:
- CA 提供的中间证书(如 Let’s Encrypt 的 R3、DigiCert 的 G2 中间证书)
- 必要时追加对应的根证书(例如 ISRG Root X1,仅当 OCSP 响应由根 CA 直接签署时才需要)
- 绝对不要包含你的域名证书(
xxx.crt)或私钥 - 多段证书用空行分隔,每段以
-----BEGIN CERTIFICATE-----开头,-----END CERTIFICATE-----结尾
推荐生成方式:cat intermediate.crt root.crt > /etc/nginx/ssl/trusted-ca.pem
典型正确配置示例
放在 server 块内:
ssl_certificate /etc/nginx/ssl/fullchain.pem; # 含域名证书 + 中间证书 ssl_certificate_key /etc/nginx/ssl/privkey.pem; ssl_trusted_certificate /etc/nginx/ssl/trusted-ca.pem; # 仅含中间 + 根(用于 OCSP/mTLS 验证) ssl_stapling on; ssl_stapling_verify on; resolver 8.8.8.8 1.1.1.1 valid=300s; resolver_timeout 5s;
注意:ssl_certificate 和 ssl_trusted_certificate 是两个独立路径、两种用途,不可混用或互相替代。
验证是否生效
运行命令检查 Nginx 是否能正确加载并解析该文件:
openssl crl2pkcs7 -nocrl -certfile /etc/nginx/ssl/trusted-ca.pem | openssl pkcs7 -print_certs -noout
若能输出证书信息,说明格式合法;若报错,则文件含非法字符、私钥或顺序错误。











