ssl_trusted_certificate仅用于nginx主动验证客户端证书或上游服务器证书,不参与服务端证书链发送;必须为纯净pem格式ca证书(根+中间),不含域名证书、私钥及不可见字符,且仅在ssl_verify_client on或proxy_ssl_verify on时生效。

ssl_trusted_certificate 不是用来“补全”你网站发给浏览器的证书链,它只在 Nginx 主动验证别人时起作用——比如验客户端证书,或验反向代理的上游服务器证书。想让访客不看到“证书链不完整”警告,得靠 ssl_certificate 文件本身拼对顺序。
它到底验证谁?
这个指令定义的是 Nginx 信任哪些 CA,仅用于以下两种内部校验场景:
- 启用双向 TLS(mTLS)时:配合 ssl_verify_client on,Nginx 用它检查用户提供的客户端证书是否由你指定的 CA 或其下级签发;
- 反向代理 HTTPS 后端时:实际应使用 proxy_ssl_trusted_certificate(不是 ssl_trusted_certificate),配合 proxy_ssl_verify on,验证后端返回的证书是否可信。
文件内容必须干净且准确
指向的 PEM 文件只能含 CA 证书(根证书和/或中间证书),不能混入:
- 你的域名证书(那是 ssl_certificate 的事);
- 私钥(哪怕只有一行也会导致解析失败);
- 不可见字符、BOM 头、Windows 换行符(CRLF)。
推荐合并方式:cat root.crt intermediate.crt > trusted_ca.pem;验证是否有效可运行:openssl crl2pkcs7 -nocrl -certfile trusted_ca.pem | openssl pkcs7 -print_certs -noout,能输出证书信息即合格。
常见误配与对应解法
很多人把它和证书链补全混淆,结果白忙一场:
- 浏览器报“NET::ERR_CERT_AUTHORITY_INVALID”或 SSL Labs 显示链不完整 → 问题出在 ssl_certificate 文件没包含中间证书,跟 ssl_trusted_certificate 无关;
- 配置了 ssl_trusted_certificate 却仍无法通过 mTLS 认证 → 检查该文件是否真含签发客户端证书的根 CA,且未遗漏中间层;
- proxy_pass 到内网 HTTPS 服务失败,日志提示 “unable to get local issuer certificate” → 应确认用的是 proxy_ssl_trusted_certificate,路径正确,且文件里有对应内网 CA 的根证书。
典型配置片段参考
双向 TLS 场景:
ssl_verify_client on;
ssl_trusted_certificate /etc/nginx/ssl/internal-ca-root-and-intermediates.pem;
ssl_verify_depth 3;
反向代理校验上游场景:
proxy_ssl_verify on;
proxy_ssl_trusted_certificate /etc/nginx/ssl/upstream-ca-bundle.pem;
proxy_ssl_server_name on;
proxy_ssl_name "api.internal";











