Nginx反向代理验证HTTPS后端证书需proxy_ssl_trusted_certificate(PEM格式根/中间CA)、proxy_ssl_verify on、proxy_ssl_name和proxy_ssl_server_name on四者协同;文件严禁含私钥或终端证书,且须用openssl pkcs7 -print_certs验证合法性。

要让 Nginx 在反向代理到 HTTPS 后端时真正验证其证书合法性,proxy_ssl_trusted_certificate 不是孤立配置项,而是信任链验证的“信任锚点”——它必须配合其他指令协同工作,且文件内容需严格符合要求。
信任证书文件的内容与格式规范
该指令指向的文件只能是 PEM 格式的 CA 证书集合,不含私钥、不含你的服务器证书,也不含后端服务的终端证书。常见错误是把 fullchain.pem 或 server.crt 直接当 trusted_ca.pem 用,这会导致校验失败。
- 文件应只包含根 CA 和中间 CA 证书,按“自顶向下”顺序拼接:根证书 → 中间证书1 → 中间证书2
- 每张证书以
-----BEGIN CERTIFICATE-----开头,-----END CERTIFICATE-----结尾,之间不能有空行或多余字符 - 推荐路径:
/etc/ssl/certs/ca-certificates.crt(系统级可信包)或自建的/etc/nginx/ssl/trusted_ca.pem - 验证有效性:运行
openssl crl2pkcs7 -nocrl -certfile trusted_ca.pem | openssl pkcs7 -print_certs -noout,能正常输出证书信息即为合法
必须配套启用的三项关键指令
仅设置 proxy_ssl_trusted_certificate 不起作用。Nginx 要完成一次完整 TLS 证书校验,还需明确告诉它“是否校验”“校验哪个域名”“是否发 SNI”:
⚠️ 已弃用 — 该技能已拆分为两个独立技能,以提升模块化程度:**webchat-https-proxy**(HTTPS/WSS 反向代理)和 **webchat-voi...**
-
proxy_ssl_verify on;—— 启用上游证书验证开关(默认是 off) -
proxy_ssl_name "api.example.com";—— 显式指定期望的后端域名,用于匹配证书中的 Subject Alternative Name(SAN)。若proxy_pass使用 IP 或变量(如https://$host),此项不可省略 -
proxy_ssl_server_name on;—— 启用 TLS SNI 扩展,确保 Nginx 在握手时向后端发送正确域名,对接泛域名或云厂商 API 时尤为关键
增强验证鲁棒性的补充配置
生产环境建议追加以下两项,避免因证书链深度不足或协议降级导致校验中断:
-
proxy_ssl_verify_depth 3;—— 默认只验证 1 层(终端证书 → 根证书),但多数公有云后端返回的是终端证书 + 一级中间证书,设为 2 或 3 更稳妥 -
proxy_ssl_protocols TLSv1.2 TLSv1.3;—— 禁用 TLSv1.0/TLSv1.1,防止握手阶段被降级攻击绕过校验
自签名或私有 CA 的特殊处理
如果后端使用自签名证书,或由企业内网私有 CA 签发,必须将该私有根证书(或含中间证书)的内容追加进 proxy_ssl_trusted_certificate 所指文件中。不能依赖系统默认证书包,否则校验必然失败。
例如:将内网 CA 的 internal-root.crt 和 internal-intermediate.crt 合并:cat internal-root.crt internal-intermediate.crt > /etc/nginx/ssl/trusted_ca.pem

















