启用 proxy_ssl_verify 需同时配置 proxy_ssl_verify、proxy_ssl_trusted_certificate、proxy_ssl_name 和 proxy_ssl_server_name 四项指令,缺一不可;否则将返回 502 错误。

Nginx 启用 proxy_ssl_verify 是保障反向代理到 HTTPS 后端时通信安全的关键步骤,它能防止连接被劫持或误连到证书异常的服务。实际配置不是只加一行 on 就完事,必须配合多个指令协同生效。
必须配齐的四个核心指令
单独开启 `proxy_ssl_verify on;` 会导致校验失败并返回 502 错误。以下四项缺一不可:
- proxy_ssl_verify on; —— 明确启用上游证书验证
-
proxy_ssl_trusted_certificate /path/to/ca-bundle.crt; —— 指定可信根证书路径,推荐使用系统级证书包(如
/etc/ssl/certs/ca-certificates.crt)或 Mozilla 的cacert.pem -
proxy_ssl_name "backend.example.com"; —— 显式声明期望的后端域名,用于匹配证书中的 SAN 字段;若
proxy_pass使用 IP 或变量(如https://$upstream_host),此项必须设置,否则校验直接失败 - proxy_ssl_server_name on; —— 启用 TLS SNI 扩展,确保 Nginx 在握手时向后端发送正确的域名,尤其对接泛域名或 SaaS 类后端(如阿里云、腾讯云 API)时必需
补充建议:提升验证可靠性
基础校验之外,加上这几项可覆盖更多边界情况:
- proxy_ssl_verify_depth 3; —— 设置证书链最大验证深度,默认为 1,多数生产环境需设为 2 或 3,避免因中间 CA 缺失导致失败
- proxy_ssl_protocols TLSv1.2 TLSv1.3; —— 禁用老旧协议,防止降级攻击
- 若后端使用自签名证书或私有 CA,需把其根证书或中间证书内容追加进
proxy_ssl_trusted_certificate所指文件中,不能仅靠系统默认证书
常见失败原因与快速排查
启用后出现 SSL_do_handshake() failed 或 certificate verify failed,优先检查:
⚠️ 已弃用 — 该技能已拆分为两个独立技能,以提升模块化程度:**webchat-https-proxy**(HTTPS/WSS 反向代理)和 **webchat-voi...**
- 后端是否只返回终端证书,未附带完整证书链?可通过
openssl s_client -connect backend.example.com:443 -servername backend.example.com查看Verify return code和证书输出行数 -
proxy_ssl_name值是否与后端证书 SAN 完全一致?注意大小写和通配符(*.example.com不匹配api.example.com) -
proxy_ssl_trusted_certificate文件路径是否正确、Nginx 进程是否有读取权限?可用nginx -t验证语法,再用ls -l检查文件权限 - 日志级别设为
error_log /var/log/nginx/error.log debug;可捕获详细 TLS 握手过程,但仅临时开启,避免日志暴增
一个可直接参考的 location 示例
假设将请求转发至内网 HTTPS 接口 https://10.0.2.100:8443,且该服务证书由内部 CA 签发:
location /api/ {
proxy_pass https://10.0.2.100:8443/;
proxy_ssl_verify on;
proxy_ssl_trusted_certificate /etc/nginx/ssl/internal-ca.crt;
proxy_ssl_name "api.internal.company";
proxy_ssl_server_name on;
proxy_ssl_verify_depth 2;
proxy_ssl_protocols TLSv1.2 TLSv1.3;
<pre class="brush:php;toolbar:false;"># 其他常规代理设置
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
不复杂但容易忽略










