必须配置 proxy_ssl_protocols TLSv1.2 TLSv1.3,且仅在 location 或 upstream 块内配合 proxy_pass https:// 使用;需同步启用 proxy_ssl_server_name、指定 proxy_ssl_name、设置强加密套件并开启证书校验。

要让 Nginx 在反向代理时**强制只用 TLS 1.2 或更高版本**(即禁用 TLSv1 和 TLSv1.1),关键不是全局改 ssl_protocols,而是精准配置 proxy_ssl_protocols 指令——它专用于控制 Nginx **作为客户端**连接上游 HTTPS 服务时的协议选择。
明确作用域:只在 proxy_pass 场景下生效
proxy_ssl_protocols 必须放在 location 或 upstream 块内,且仅影响 Nginx 主动发起的出站 TLS 连接(比如代理到 https://api.example.com)。它和面向浏览器的 ssl_protocols 完全无关。
- 写在
http或server级别无效 - 若
proxy_pass目标是 HTTP(如http://127.0.0.1:3000),该指令完全不触发 - 必须搭配
proxy_pass https://...才起作用
正确写法:显式列出 TLSv1.2 和 TLSv1.3
现代安全标准(如 PCI DSS、NIST SP 800-52r2)要求禁用 TLSv1/TLSv1.1。Nginx 默认行为因版本而异,不能依赖——必须显式声明:
FastAPI + Flask 混合部署最佳实践,解决路由定义、API 代理等常见问题,适用于同时运行 FastAPI API 与 Flask 前端的场景。
- 推荐配置(兼容主流后端):
proxy_ssl_protocols TLSv1.2 TLSv1.3; - 若后端明确不支持 TLSv1.3(如部分旧版 Spring Boot + Tomcat),可暂退一步:
proxy_ssl_protocols TLSv1.2; - 绝对不要写
TLSv1或TLSv1.1,否则等于主动降级
配套必要配置:避免握手失败
只设协议不够,还需同步调整加密套件与 SNI 行为:
- 启用 SNI(尤其当后端是多域名共用 IP 的 HTTPS 服务):
proxy_ssl_server_name on; - 指定目标域名(SNI 字段值):
proxy_ssl_name "api.example.com";(不可省略,$host不可靠) - 匹配强加密套件(避开已淘汰的 SHA1、RC4):
proxy_ssl_ciphers 'ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384'; - 证书校验建议开启:
proxy_ssl_verify on;,并配好proxy_ssl_trusted_certificate
验证是否生效
配置后 reload Nginx,用以下命令确认出站连接实际使用的协议:
- 在 Nginx 服务器上执行:
openssl s_client -connect api.example.com:443 -tls1_2 -servername api.example.com(应成功) - 同理测试
-tls1_1应失败(返回SSL routines:tls_process_server_hello:protocol is down) - 检查 Nginx error log,若出现
SSL_do_handshake() failed,大概率是后端不支持所设协议,需回查后端 TLS 能力

















