要强制反向代理链路使用 tls 1.3,必须确保 openssl ≥ 1.1.1、proxy_ssl_protocols 仅设为 tlsv1.3、配套 cipher 与证书校验同步配置,并通过日志验证兼容性后再切换。

要让反向代理链路强制走 TLS 1.3,关键不是加个 TLSv1.3 就完事,而是切断所有降级可能——proxy_ssl_protocols 必须只写 TLSv1.3,且不能和旧协议共存。
必须确认底层 OpenSSL 版本达标
Nginx 自身不实现 TLS,它依赖编译时绑定的 OpenSSL 库。即使 Nginx 是 1.20+,若 nginx -V | grep OpenSSL 显示的是 OpenSSL 1.0.2k 或更低,TLS 1.3 就不可用。
- ✅ 正确做法:运行
nginx -V | grep "built with OpenSSL",确认版本 ≥1.1.1(如OpenSSL 1.1.1w) - ❌ 错误参考:
openssl version命令结果只是 CLI 工具版本,与 Nginx 运行时无关 - 若不达标:需重编译 Nginx 并指定新版 OpenSSL 路径,或换用 Ubuntu 22.04+/AlmaLinux 9 等自带高版本 OpenSSL 的系统包
proxy_ssl_protocols 必须单独、显式声明
该指令不继承 http 或 server 块中的 ssl_protocols,必须在 location 或 upstream 对应的代理上下文中明确配置:
FastAPI + Flask 混合部署最佳实践,解决路由定义、API 代理等常见问题,适用于同时运行 FastAPI API 与 Flask 前端的场景。
- 正确示例:
location /api/ { proxy_pass https://backend; proxy_ssl_protocols TLSv1.3; # 仅这一项,无空格、无其他协议 proxy_ssl_verify on; proxy_ssl_trusted_certificate /etc/nginx/ssl/ca-bundle.crt; } - 错误写法:
-
proxy_ssl_protocols TLSv1.2 TLSv1.3→ 会协商降级,不“强制” - 缺少
proxy_ssl_trusted_certificate→ 后端用私有 CA 或自签名证书时,proxy_ssl_verify on会直接拒绝连接
-
配套 cipher 和验证必须同步收紧
TLS 1.3 使用固定五组密钥交换+加密组合,传统 cipher 套件无效,混用会导致协商失败:
- 推荐
proxy_ssl_ciphers设置(仅 TLS 1.3 兼容):proxy_ssl_ciphers TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256:TLS_AES_128_GCM_SHA256;
- 同时启用证书校验:
-
proxy_ssl_verify on; -
proxy_ssl_trusted_certificate指向可信根证书文件(不能是中间证书或服务端证书) - 若后端证书由 Let's Encrypt 或公网 CA 签发,可用 Mozilla 维护的
ca-bundle.crt
-
不建议跳过兼容性验证直接强制
虽然目标是“强制”,但生产环境应先观察实际客户端支持情况:
- 第一阶段:临时设为
proxy_ssl_protocols TLSv1.2 TLSv1.3,日志中加$ssl_protocol变量统计占比 - 若连续 3 天 TLS 1.3 占比超 98%,且无关键业务报错(如特定 IoT 设备、老旧内网系统),再切到纯
TLSv1.3 - 切换后务必测试后端连通性,尤其注意 Java 8u251 以下、Go 1.14 以前等旧运行时对 TLS 1.3 的支持边界
不复杂但容易忽略










