Nginx 通过 proxyssl* 指令实现安全反向代理HTTPS后端,必须同时配置 proxy_ssl on、proxy_ssl_verify on、proxy_ssl_trusted_certificate 和 proxy_ssl_name 四项指令,缺一不可;还需确保证书文件为合规PEM格式、路径正确、权限合理,并建议补充 proxy_ssl_verify_depth、proxy_ssl_protocols 等增强安全性与稳定性。

直接写 proxy_pass https:// 并不能让 Nginx 安全、可靠地连接 HTTPS 后端——它只是改变了协议,不自动启用证书校验、SNI 或主机名匹配。真正起作用的是 proxy_ssl_* 系列指令,且必须成套配置、位置正确、内容合规。
必须同处一个 location 或 upstream 块的四项核心指令
缺一不可,否则会静默跳过验证或返回 502:
- proxy_ssl on; —— 开关指令,不加则所有 proxy_ssl_* 都无效
- proxy_ssl_verify on; —— 显式启用证书链和有效期校验(默认 off)
- proxy_ssl_trusted_certificate /path/to/ca-bundle.crt; —— 指向仅含根/中间 CA 的 PEM 文件,不能混入私钥或后端证书
-
proxy_ssl_name "backend.example.com"; —— 强制匹配证书中的 SAN 字段;若
proxy_pass写的是 IP 或变量,此项必不可少
同时建议加上 proxy_ssl_server_name on;,确保 TLS 握手时发送正确的 SNI 域名,避免后端返回默认证书。
证书文件内容与格式必须严格合规
信任证书文件不是“能读就行”,而是直接影响校验逻辑:
- 只允许 PEM 格式的根证书和中间证书,按“根 → 中间”顺序拼接
- 每张证书以
-----BEGIN CERTIFICATE-----开头、-----END CERTIFICATE-----结尾 - 禁止空行、多余字符、私钥、终端证书(即后端自己的 .crt)
- 权限设为 644,路径用绝对路径,确保 Nginx worker 进程可读
- 可用
openssl x509 -in /path/to/ca.crt -text -noout验证单张证书;用openssl crl2pkcs7 -nocrl -certfile /path/to/bundle.crt | openssl pkcs7 -print_certs -noout验证整个 bundle
生产环境推荐补充配置
提升稳定性与安全性,覆盖常见边界场景:
- proxy_ssl_verify_depth 3; —— 多数商用证书含两级中间 CA,设为 3 可完整验证整条链
- proxy_ssl_protocols TLSv1.2 TLSv1.3; —— 明确禁用 TLSv1.0/v1.1,防止协议降级干扰校验
- proxy_ssl_session_reuse off; —— 关闭 TLS 会话复用,避免异常状态缓存导致后续请求绕过校验
- proxy_set_header X-Forwarded-Proto $scheme; 和 proxy_set_header Host $host; —— 补齐协议与主机头,避免后端路由或跳转逻辑出错
调试失败时的关键排查点
遇到 SSL_do_handshake() failed 或 certificate verify failed:
- 确认
proxy_ssl on;是否被嵌套的if或低优先级location覆盖 - 用
openssl s_client -connect backend:443 -servername backend.example.com直连测试后端 TLS 是否正常 - 临时开启
error_log /var/log/nginx/error.log debug;查看握手细节(注意日志量大,用完即关) - 检查后端证书是否在有效期内、SAN 是否包含
proxy_ssl_name指定的域名


















