proxy_ssl_verify on 必须配合 proxy_ssl_trusted_certificate、proxy_ssl_name 和 proxy_ssl_server_name on 三者协同生效,用于强制校验上游 HTTPS 服务器证书的合法性、有效性与域名匹配性,防止中间人攻击。

必须启用的核心配置项
仅写 proxy_ssl_verify on; 不会成功,还需以下三项配合:
-
指定可信根证书路径:用
proxy_ssl_trusted_certificate指向一个 PEM 格式的 CA 证书文件(如系统级的/etc/ssl/certs/ca-certificates.crt或 Mozilla 的cacert.pem); -
明确期望的证书域名:通过
proxy_ssl_name设置目标域名(例如"api.internal.example.com"),否则 Nginx 默认用proxy_pass中的域名匹配 SAN 字段,若用 IP 或变量则必然失败; -
启用 TLS SNI 扩展:设置
proxy_ssl_server_name on;,确保握手时发送正确的 Server Name,这对多域名后端或泛域名证书必不可少。
建议补充的增强配置
提升验证稳定性与兼容性:
-
证书链深度:用
proxy_ssl_verify_depth 2;或3,尤其当后端证书由中间 CA 签发时,默认值 1 不足以完成完整链校验; -
复用 SSL 会话:加
proxy_ssl_session_reuse on;减少重复握手开销; -
协议与加密套件控制(可选):如
proxy_ssl_protocols TLSv1.2 TLSv1.3;和proxy_ssl_ciphers HIGH:!aNULL:!MD5;,避免老旧不安全组合。
典型配置示例
假设后端地址为 https://10.0.1.5:443,期望证书绑定 api.internal.example.com:
location /api/ {
proxy_pass https://10.0.1.5:443/;
proxy_ssl_verify on;
proxy_ssl_trusted_certificate /etc/nginx/ssl/ca-bundle.crt;
proxy_ssl_verify_depth 3;
proxy_ssl_name "api.internal.example.com";
proxy_ssl_server_name on;
proxy_ssl_session_reuse on;
}
常见失败原因与排查方向
启用后返回 502 Bad Gateway 或日志中出现 certificate verify failed,通常源于:
- 后端未返回完整证书链(只发了终端证书),需补全中间 CA 到
proxy_ssl_trusted_certificate文件中; -
proxy_ssl_name值与证书中的 SAN 不匹配(注意大小写、通配符、是否含www.); - 证书已过期、被吊销(Nginx 原生不查 CRL/OCSP,需依赖系统级验证或额外工具);
- OpenSSL 版本过低或编译时未启用 SNI 支持(可通过
nginx -V 2>&1 | grep -i sni检查)。


















