ssl_trusted_certificate仅用于Nginx内部验证客户端或上游服务证书,不参与发送给浏览器的证书链;其内容须为PEM格式的受信CA证书,与ssl_certificate分工明确,不可混用。

ssl_trusted_certificate 这个指令不用于配置 Nginx 自身对外提供的服务端证书链,它只在两种特定场景下起作用:客户端证书验证(mTLS) 或 反向代理中验证上游服务证书(此时应使用 proxy_ssl_trusted_certificate)。很多人误以为设了它就能“补全自己网站的证书链”,这是常见误解。
✅ 它的真实用途:验证别人,不是补全自己
- 当你启用
ssl_verify_client on;(要求访客提供客户端证书),Nginx 用ssl_trusted_certificate指定的文件,去验证该客户端证书是否由你信任的 CA 签发。 - 它完全不参与 Nginx 向浏览器发送的服务端证书链构建过程。浏览器看到的证书链是否完整,只取决于
ssl_certificate文件内容。
? 正确配置 ssl_trusted_certificate 的方法
1. 准备信任的 CA 证书文件
- 文件路径例如:
/etc/nginx/ssl/client-ca-bundle.pem - 内容只能是:
- 根 CA 和/或中间 CA 的公钥证书(PEM 格式)
- 每张证书以
-----BEGIN CERTIFICATE-----开头、-----END CERTIFICATE-----结尾 - 多个证书拼接时,按“根 → 中间”顺序,不能有空行、私钥、终端证书或注释
- 验证命令:
openssl x509 -in /etc/nginx/ssl/client-ca-bundle.pem -noout -text
若报错或无输出,说明格式有问题。
2. 在 server 块中启用客户端双向认证
server {
listen 443 ssl;
server_name api.example.com;
ssl_certificate /etc/nginx/ssl/server.crt;
ssl_certificate_key /etc/nginx/ssl/server.key;
# 启用客户端证书验证
ssl_verify_client on;
# 指定信任哪些 CA 来签发客户端证书
ssl_trusted_certificate /etc/nginx/ssl/client-ca-bundle.pem;
# 可选:验证深度(如含多级中间 CA)
ssl_verify_depth 2;
}⚠️ 注意:
ssl_trusted_certificate必须和ssl_verify_client on同时存在才生效;单独写它没有任何效果。
❌ 常见错误操作(千万别做)
- 把
fullchain.pem或后端服务的server.crt直接当ssl_trusted_certificate使用 - 在
ssl_certificate指向的文件里漏掉中间证书(这会导致浏览器报“证书链不完整”,但和ssl_trusted_certificate无关) - 以为设置了
ssl_trusted_certificate就能让浏览器信任你的自签名站点 —— 浏览器信任与否,只看你有没有把根证书导入系统或浏览器信任库
? 对比:ssl_trusted_certificate vs proxy_ssl_trusted_certificate
| 场景 | 指令 | 作用对象 | 是否影响浏览器访问你的站点 |
|---|---|---|---|
| 要求访客提供证书(如 API 调用方) | ssl_trusted_certificate |
客户端证书 | 否 |
Nginx 代理到 https://backend 并校验后端证书 |
proxy_ssl_trusted_certificate |
上游服务器证书 | 否(只影响 proxy_pass 是否成功) |
后者还需配合:
proxy_ssl_verify on; proxy_ssl_name "backend.example.com"; proxy_ssl_server_name on;
不复杂但容易忽略。


















