必须在upstream或location块内配置proxy_ssl_protocols tlsv1.2 tlsv1.3,禁用tlsv1.0/tlsv1.1;同步启用proxy_ssl_verify on、强cipher白名单及proxy_ssl_server_name on,满足pci dss等合规要求。

要通过 proxy_ssl_protocols 限制 Nginx 反向代理到后端 HTTPS 服务时使用的 TLS 协议等级,核心是明确它只控制“Nginx 作为客户端”发起的出站连接,且必须配合版本支持、作用域、证书验证等环节才能真正生效。
必须放在 upstream 或 location 块内才有效
该指令不继承自 http 或 server 块中的 ssl_protocols,写在全局位置完全无效。正确做法是:
- 在
upstream块内部直接配置(推荐,便于复用和审计) - 或在含
proxy_pass https://的location块中紧邻该指令配置 - 若
proxy_pass目标是 HTTP,则此指令根本不触发
协议值必须显式、精准声明
现代安全标准(如 PCI DSS、NIST SP 800-52r2)要求禁用 TLSv1.0 和 TLSv1.1。配置时需严格筛选:
FastAPI + Flask 混合部署最佳实践,解决路由定义、API 代理等常见问题,适用于同时运行 FastAPI API 与 Flask 前端的场景。
- 仅允许:✅
proxy_ssl_protocols TLSv1.2 TLSv1.3;(兼容主流后端) - 强制 TLS 1.3:✅
proxy_ssl_protocols TLSv1.3;(不可混入 TLSv1.2,否则可能降级) - 禁止出现:❌
TLSv1、TLSv1.1、SSLv3等已淘汰协议
必须同步启用证书校验与 SNI 支持
只设协议不等于链路安全。若后端使用 HTTPS,还需确保握手能完成并验证可信:
-
proxy_ssl_verify on;—— 启用证书合法性检查 -
proxy_ssl_trusted_certificate /path/to/ca-bundle.crt;—— 指向含可信根及中间 CA 的 PEM 文件 -
proxy_ssl_name "backend.example.com";—— 显式指定期望域名,用于匹配证书 SAN -
proxy_ssl_server_name on;—— 启用 SNI,确保握手时发送正确主机名
配套加密套件需匹配协议能力
TLS 版本和加密套件必须协同,否则可能握手失败或静默降级:
- 若只用 TLSv1.3,推荐:
proxy_ssl_ciphers "TLS_AES_256_GCM_SHA384:TLS_AES_128_GCM_SHA256:TLS_CHACHA20_POLY1305_SHA256"; - 若兼容 TLSv1.2 + TLSv1.3,用强套件白名单,避开 RC4、SHA1、EXPORT 等弱算法
- 避免混用:不要在同一个
proxy_ssl_ciphers中同时写 TLS 1.2 和 TLS 1.3 套件标识(如ECDHE-RSA-AES256-GCM-SHA384与TLS_AES_256_GCM_SHA384并存)










