ssl_trusted_certificate用于验证客户端证书或上游服务器证书,不参与服务器证书发送;仅在启用ssl_verify_client或proxy_ssl_verify时生效,需为PEM格式CA证书链。

ssl_trusted_certificate 是 Nginx 中用于配置“受信任的 CA 证书链”的指令,它不参与服务器证书的发送,只用于验证客户端证书(在启用 ssl_verify_client on 时)或上游服务器证书(在反向代理启用 proxy_ssl_verify on 时)。正确配置它,是实现双向 TLS(mTLS)或安全上游校验的关键一步。
明确 ssl_trusted_certificate 的作用场景
这个指令本身不会影响浏览器如何验证你的网站证书。你的站点证书是否被浏览器信任,取决于:
- 你配置的
ssl_certificate是否由浏览器内置信任的根 CA 签发; - 是否通过
ssl_certificate_key提供了对应私钥; - 是否在
ssl_certificate文件中完整包含中间证书(即证书链),否则可能触发链不完整告警。
ssl_trusted_certificate 只在以下两种情况生效:
- 启用客户端证书认证(
ssl_verify_client on):Nginx 用它来验证用户提供的客户端证书是否由你指定的 CA(或其下级)签发; - 反向代理 HTTPS 上游(
proxy_pass https://...+proxy_ssl_verify on):Nginx 用它来验证后端服务器返回的证书是否可信。
证书文件内容与格式要求
该指令指向的文件必须是 PEM 格式,且只含CA 证书(根证书和/或中间证书),不能包含私钥、不能包含你的服务器证书(ssl_certificate 中已有的部分也不应重复放入)。
- 推荐将所有需要信任的根 CA 和中间 CA 证书按“自顶向下”顺序拼接(根 → 中间1 → 中间2),每张证书以
-----BEGIN CERTIFICATE-----开头,-----END CERTIFICATE-----结尾; - 可使用
cat root.crt intermediate.crt > trusted_ca.pem合并; - 验证文件是否合法:运行
openssl crl2pkcs7 -nocrl -certfile trusted_ca.pem | openssl pkcs7 -print_certs -noout,能正常输出证书信息即有效。
常见配置示例
双向 TLS(客户端证书校验)
server {
listen 443 ssl;
ssl_certificate /path/to/server.crt; # 你的域名证书 + 中间链
ssl_certificate_key /path/to/server.key;
ssl_verify_client on;
ssl_trusted_certificate /path/to/trusted_ca.pem; # 仅放你认可的 CA(如企业内网根 CA)
ssl_verify_depth 2;
}代理到 HTTPS 后端并校验其证书
location /api/ {
proxy_pass https://backend.example.com/;
proxy_ssl_verify on;
proxy_ssl_trusted_certificate /path/to/trusted_ca.pem; # 注意:这里用 proxy_ssl_trusted_certificate
proxy_ssl_verify_depth 3;
}⚠️ 注意:proxy_ssl_trusted_certificate 是反向代理专用指令,和 ssl_trusted_certificate 独立,不可混用。
调试与排错要点
- 若客户端证书校验失败,检查 Nginx error log,常见报错如
SSL_do_handshake() failed (SSL: error:1417C086:SSL routines:tls_process_client_certificate:certificate verify failed),说明证书未被ssl_trusted_certificate中的 CA 链覆盖; - 确认客户端证书的
Issuer字段,是否严格匹配你放入trusted_ca.pem中某张证书的Subject; - 用
openssl x509 -in client.crt -text -noout | grep -A1 "Issuer\|Subject"查看证书层级关系; - 确保时间同步:Nginx 验证证书时会检查有效期,系统时间偏差会导致验证失败。


















