Nginx校验后端HTTPS证书需四指令协同:proxy_ssl_verify on、proxy_ssl_trusted_certificate指定CA证书链、proxy_ssl_name声明匹配主机名、proxy_ssl_server_name on启用SNI;缺一不可,否则验证失败。

要让 Nginx 真正校验后端 HTTPS 服务的证书是否有效、可信,不能只写 proxy_ssl_verify on。它是一套协同生效的机制,核心是让 Nginx 在建立上游连接时,像浏览器一样完成完整的 TLS 证书验证流程。
必须配齐四个关键指令
单独开启 proxy_ssl_verify 会直接失败。以下四项缺一不可:
-
proxy_ssl_verify on; —— 明确启用校验(默认是
off) -
proxy_ssl_trusted_certificate /path/to/ca-bundle.crt; —— 指向包含根证书和中间 CA 的 PEM 文件(例如系统级
/etc/ssl/certs/ca-certificates.crt或自建私有 CA 的 bundle) -
proxy_ssl_name "backend.example.com"; —— 显式声明期望匹配的主机名,用于比对后端证书中的 SAN 字段;若
proxy_pass写的是 IP 或变量,此项必须设置 - proxy_ssl_server_name on; —— 启用 TLS SNI 扩展,确保 Nginx 握手时发送正确域名,避免后端返回默认或不匹配的证书
验证后端证书链是否完整
Nginx 默认只接受深度为 1 的证书链(终端直连根 CA),但大多数证书实际是三级结构(终端 → 中间 CA → 根 CA)。若校验失败并报 certificate verify failed,先检查链是否齐全:
- 用
openssl s_client -connect backend.example.com:443 -servername backend.example.com连接后端,观察输出中证书块数量及Verify return code - 返回码非 0 表示链不全或不可信;证书块少于 2 行,大概率只返回了终端证书
- 解决方式:让后端服务配置返回完整证书链,或把缺失的中间 CA 补进
proxy_ssl_trusted_certificate指定的文件中
调试与日志定位问题
生产环境不建议长期开启 debug 日志,但临时排障很有效:
- 在
http或server块中加:error_log /var/log/nginx/error.log debug; - 重载配置后触发一次请求,查看日志中是否有
SSL_do_handshake() failed、certificate subject name does not match或unable to get local issuer certificate等提示 - 验证配置语法:
nginx -t;检查证书文件权限:ls -l /etc/nginx/ssl/upstream-ca.crt(Nginx 工作进程用户需有读权限)
内网场景下的安全加固要点
企业内网常使用私有 CA 或自签名证书,需额外注意:
- 不要把后端自己的证书误当 CA 证书放进
proxy_ssl_trusted_certificate;该文件必须是签发后端证书的上级 CA(含根和中间) - 若后端证书 SAN 是
svc.internal,则proxy_ssl_name必须严格写成"svc.internal"(大小写敏感,不支持通配符匹配子域) - 禁用危险头透传:
proxy_hide_header Server;、proxy_hide_header X-Powered-By; - 限制客户端信息伪造:
set_real_ip_from 10.0.0.0/8;+real_ip_header X-Forwarded-For;,只信任内网来源的转发头


















