必须同时配置proxy_ssl_verify on、proxy_ssl_trusted_certificate、proxy_ssl_name和proxy_ssl_server_name四项指令,缺一不可;否则校验失败并返回502错误。

要让 Nginx 在反向代理到 HTTPS 后端时真正校验其证书是否合法,不能只写 proxy_ssl_verify on; —— 这一行单独存在会静默失效,甚至引发 502 错误。必须四点齐备、协同生效,才能完成一次完整、可信的 TLS 证书验证。
必须同时配置的四个核心指令
缺一不可,且需全部放在 location 或 upstream 块内(http 或 server 块中声明无效):
-
proxy_ssl_verify on; —— 明确启用上游证书校验开关(默认是
off,不设即不验) - proxy_ssl_trusted_certificate /path/to/ca-bundle.crt; —— 指向 PEM 格式的可信根/中间 CA 证书文件,仅含证书,不含私钥或后端终端证书
-
proxy_ssl_name "backend.example.com"; —— 显式声明期望的后端域名,用于匹配证书中的 Subject Alternative Name(SAN),尤其当
proxy_pass使用 IP、变量(如https://$host)时必须设置 - proxy_ssl_server_name on; —— 启用 TLS SNI 扩展,确保 Nginx 握手时向后端发送正确域名,否则多域名虚拟主机或云服务可能返回默认/不匹配证书
提升校验鲁棒性的关键补充项
生产环境建议追加,避免因链深度不足、协议降级或连接复用绕过校验:
安装并运行 Aperture(Lightning Labs 的 L402 闪电反向代理),用于创建 L402 付费墙、配置付费 API 端点、为其他代理托管付费内容或测试 L402 认证流程。
- proxy_ssl_verify_depth 3; —— 默认只验 1 层(终端 → 根),但多数后端使用“终端 → 中间 CA → 根 CA”三级链,设为 2 或 3 更稳妥
- proxy_ssl_protocols TLSv1.2 TLSv1.3; —— 禁用 TLSv1.0/v1.1,防止握手被降级攻击干扰验证逻辑
- proxy_ssl_session_reuse off; —— 关闭 TLS session 复用,避免缓存异常证书状态导致后续请求绕过校验
信任证书文件的正确准备方式
proxy_ssl_trusted_certificate 所指文件必须满足以下要求:
- 格式为纯 PEM,每张证书以
-----BEGIN CERTIFICATE-----开头、-----END CERTIFICATE-----结尾 - 只包含可信根 CA 和中间 CA 证书(可多个拼接),顺序不限,但不能混入私钥、后端服务器证书或 fullchain.pem
- 推荐路径:
/etc/nginx/ssl/upstream-ca.crt(权限设为644),或系统级证书包如/etc/ssl/certs/ca-certificates.crt - 验证方法:
openssl pkcs7 -print_certs -in /path/to/file.crt -noout能正常输出证书信息即为合法
常见失败原因与快速确认点
若启用后出现 SSL_do_handshake() failed 或 certificate verify failed,优先检查:
- 后端是否返回完整证书链?用
openssl s_client -connect host:port -servername domain -showcerts查看输出证书数量和层级 -
proxy_ssl_name是否与后端证书 SAN 完全一致(注意大小写、通配符限制,如*.api.com不匹配v1.api.com) - Nginx 进程对
proxy_ssl_trusted_certificate文件是否有读权限?用ls -l确认 - 执行
nginx -t验证语法,再nginx -s reload生效;临时开启error_log ... debug;可捕获详细握手日志










