必须同时配置proxy_ssl_verify on、proxy_ssl_trusted_certificate、proxy_ssl_name和proxy_ssl_server_name四项指令,缺一不可且须同在location或upstream块内,否则校验失败返回502错误。

只写 proxy_ssl_verify on 不会真正校验后端 HTTPS 服务的安全性,反而大概率导致 502 错误。它必须和另外三个指令在同一个 location 块内协同生效,构成完整验证闭环。
必须配齐的四个核心指令
缺一不可,且必须同处一个 location 或 upstream 块中:
-
proxy_ssl_verify on;——显式开启校验开关(默认是
off,不写等于完全跳过证书检查) - proxy_ssl_trusted_certificate /path/to/ca-bundle.crt;——指向 PEM 格式的可信 CA 文件,内容只能是根证书和中间 CA(不含私钥、不含后端证书)
-
proxy_ssl_name "backend.example.com";——声明期望匹配的主机名,用于比对后端证书中的 SAN 字段;若
proxy_pass写的是 IP 或变量(如https://$host),此项不设则校验必然失败 - proxy_ssl_server_name on;——启用 TLS SNI 扩展,确保 Nginx 握手时发送正确域名,避免后端返回默认或泛域名证书
proxy_ssl_verify_depth 要设对
该值决定 Nginx 最多允许向上追溯几级中间 CA,不是“越高越安全”,而是要匹配真实链长:
FastAPI + Flask 混合部署最佳实践,解决路由定义、API 代理等常见问题,适用于同时运行 FastAPI API 与 Flask 前端的场景。
- 自签名证书或根 CA 直签 → 设为
1 - 终端 → 中间 CA → 根 CA(主流商业证书如 Let’s Encrypt R3)→ 设为
2或3 - 企业私有 PKI 含两级中间 CA(终端 → SubCA1 → SubCA2 → 根)→ 设为
4,但需评估是否过度嵌套 - 设得太低(如
1)会导致合规证书被拒,报certificate verify failed;设得太高(如 ≥5)可能接纳不可信长链,削弱验证意义
常见失败原因与快速确认方法
出现 SSL_do_handshake() failed 或 certificate verify failed 时,优先检查:
- 用
openssl s_client -connect backend:443 -servername backend.example.com -showcerts查看后端是否返回完整证书链(输出中应有至少 2 个证书块,且Verify return code: 0 (ok)) -
proxy_ssl_name是否与证书 SAN 完全一致(大小写、通配符规则都敏感) -
proxy_ssl_trusted_certificate文件路径是否正确,Nginx 工作进程(如www-data)是否有读取权限 - 四项指令是否全部写在同一个
location块内(写在http或server顶层无效)
WebSocket(WSS)场景额外注意
代理 WSS 时,基础四指令仍必需,还需加固:
- proxy_ssl_session_reuse off;——关闭 TLS session 复用,防止异常证书状态被缓存复用
- proxy_ssl_protocols TLSv1.2 TLSv1.3;——禁用 TLSv1.0/1.1,避免协议降级干扰校验
- 确认后端监听地址为
0.0.0.0而非仅127.0.0.1,否则本机发起连接可能因绑定策略失败

















