修复证书链不完整需将域名证书与中间证书按序合并为fullchain.pem并配置ssl_certificate指向该文件,ssl_trusted_certificate仅用于客户端证书验证或反向代理上游校验,不参与服务端证书链补全。

要修复因证书链不完整导致的 SSL 报错(如浏览器提示“您的连接不是私密连接”、curl 提示 CERTIFICATE_VERIFY_FAILED 或 OpenSSL 显示 unable to get local issuer certificate),关键不是靠 ssl_trusted_certificate 来“修复服务端”,而是正确配置 ssl_certificate,并用 ssl_trusted_certificate 配合客户端验证场景(如双向 TLS 或 ssl_verify_client on)。很多人误以为设了 ssl_trusted_certificate 就能补全服务端证书链,其实它不参与服务端证书下发。
明确 ssl_trusted_certificate 的真实作用
ssl_trusted_certificate 是 Nginx 用于**验证客户端证书**的可信 CA 根证书文件(仅在启用 ssl_verify_client on 时生效),或用于 proxy_ssl_trusted_certificate(反向代理上游时验证上游证书)。它不会补全你自己的证书链,也不影响浏览器对你站点证书的校验过程。
证书链不完整的问题,根源在于:Nginx 在 TLS 握手时只发送了你的域名证书(ssl_certificate),没附带中间 CA 证书。浏览器/客户端因此无法构建从你的证书到根证书的信任路径。
正确补全服务端证书链的方法
你需要把「域名证书 + 中间证书」合并成一个 PEM 文件,作为 ssl_certificate 的值:
- 从证书颁发机构(如 Let’s Encrypt、Sectigo、DigiCert)下载完整的证书链(通常包含
your_domain.crt和ca-bundle.crt或fullchain.pem) - 按顺序拼接:先放你的域名证书,再追加中间证书(不要包含根证书)
示例命令:cat your_domain.crt intermediate.crt > fullchain.pem - 在 Nginx 配置中指定:
ssl_certificate /path/to/fullchain.pem;ssl_certificate_key /path/to/your_domain.key;
什么时候才需要配置 ssl_trusted_certificate
仅在以下两种情况使用:
-
启用客户端证书双向认证(mTLS):
ssl_verify_client on;ssl_trusted_certificate /etc/nginx/ssl/ca-root-and-intermediates.pem;
此时该文件应包含你信任的客户端证书签发者(即你允许哪些 CA 签发的客户端证书) -
反向代理且需验证上游 HTTPS 服务(配合
proxy_ssl_verify on):
实际应使用proxy_ssl_trusted_certificate,而非ssl_trusted_certificate
验证是否修复成功
修改配置后重载 Nginx(nginx -t && nginx -s reload),用以下方式确认链已完整:
- 在线检测:SSL Checker 或 DigiCert SSL Installation Diagnostics Tool
- 命令行检查:
openssl s_client -connect yourdomain.com:443 -servername yourdomain.com 2>/dev/null | openssl x509 -noout -text | grep "CA Issuers"
应能看到中间证书的 OCSP/CRL 地址;再执行:openssl s_client -connect yourdomain.com:443 -servername yourdomain.com -showcerts
输出中应显示至少两个证书(你的证书 + 中间证书) - 浏览器打开开发者工具 → 安全页 → 查看证书 → 证书路径,应显示完整层级(如 “Your Domain → R3 → ISRG Root X1”)











