nginx https代理后端证书验证必须同时配置proxy_ssl_verify on、proxy_ssl_trusted_certificate、proxy_ssl_name和proxy_ssl_server_name on四项,缺一不可且须置于location或upstream块内;信任文件仅含根/中间ca证书(pem格式),需匹配san域名并设proxy_ssl_verify_depth为3以支持完整证书链。

处理 Nginx HTTPS 代理中后端服务的证书信任问题,核心是让 Nginx 作为 HTTPS 客户端时,能正确验证后端返回的证书。这不是前端浏览器的问题,而是 proxy_pass 到 https:// 后端时,Nginx 自身校验失败导致 502 或 handshake failed。必须同时配齐四项指令,并确保信任文件内容合规。
必须启用并配齐四个关键指令
这四项必须写在 location 或 upstream 块内(server 或 http 块中无效),缺一不可:
- proxy_ssl_verify on; —— 开启对后端证书的主动校验(默认是 off,不开启等于没验证)
- proxy_ssl_trusted_certificate /etc/nginx/ssl/internal-ca.crt; —— 指向仅含可信根 CA 和中间 CA 的 PEM 文件(不能含私钥、不能含后端终端证书)
- proxy_ssl_name "api.example.com"; —— 显式指定期望匹配的域名,必须与后端证书的 SAN 字段完全一致(注意大小写、通配符、www 前缀)
- proxy_ssl_server_name on; —— 启用 TLS SNI 扩展,确保 Nginx 握手时向后端发送该域名,避免后端返回默认或错误证书
正确准备和验证信任证书文件
proxy_ssl_trusted_certificate 所指文件是信任链的锚点,常见错误是误用 fullchain.pem 或 server.crt:
- 只保留根证书和中间证书,按任意顺序拼接,每张以 -----BEGIN CERTIFICATE----- 开头、-----END CERTIFICATE----- 结尾,之间无空行
- 可用命令快速验证文件合法性:
openssl crl2pkcs7 -nocrl -certfile internal-ca.crt | openssl pkcs7 -print_certs -noout,能输出证书信息即为有效 - 若后端用自签证书或企业私有 CA,必须把该私有根证书内容追加进此文件
- 推荐路径:
/etc/nginx/ssl/upstream-ca.crt,权限设为 644
排查证书不匹配与链深度问题
即使配置齐全,仍可能因细节不匹配而失败:
- 后端证书 SAN 中未包含 proxy_ssl_name 设置的值(例如设了
api.example.com,但证书里只有example.com) - 证书链层级超过默认验证深度(proxy_ssl_verify_depth 默认为 1):商用证书多为三级链(终端 → 中间 → 根),建议显式设为 proxy_ssl_verify_depth 3;
- 协议不兼容:添加 proxy_ssl_protocols TLSv1.2 TLSv1.3;,禁用老旧协议防止握手降级干扰验证
- 临时调试可加 error_log /var/log/nginx/error.log debug;,查看日志中是否出现
SSL certificate verify ok或具体失败原因
不建议关闭验证的场景说明
proxy_ssl_verify off; 仅限本地开发或绝对可信的内网环境临时使用。生产外网环境严禁关闭——它会让 Nginx 跳过全部证书校验,失去 TLS 安全保障,等同于明文传输风险。











