Nginx反向代理强制上游使用TLS 1.3需配置proxy_ssl_protocols TLSv1.3,且依赖OpenSSL≥1.1.1、上游支持TLS 1.3,并配合proxy_ssl_verify与可信CA证书验证。

要让 Nginx 在反向代理回源(即 proxy_pass 到上游 HTTPS 服务器)时强制使用 TLS 1.3,关键不是靠 ssl_protocols,而是用专门控制上游连接的指令:proxy_ssl_protocols。
确认上游连接是否真走 TLS 1.3
该指令只影响 Nginx 主动发起的出站 HTTPS 请求(比如 proxy_pass https://api.example.com),对客户端进来的连接无影响。默认情况下,Nginx 会协商它支持的最高版本,但若不显式限制,可能回落到 TLS 1.2 —— 尤其当上游服务仍开放旧协议时。
- 必须确保 Nginx 运行时链接的 OpenSSL ≥ 1.1.1(用
nginx -V | grep OpenSSL验证) - 上游服务器(如后端 API)本身需支持 TLS 1.3,否则连接将失败
-
proxy_ssl_protocols不继承ssl_protocols的设置,必须单独配置
正确配置 proxy_ssl_protocols 强制 TLS 1.3
在对应 location 或 upstream 块中添加:
proxy_ssl_protocols TLSv1.3;
这是最简、最明确的方式。不要写成 TLSv1.2 TLSv1.3,否则无法“强制”——只要上游支持 TLS 1.2,Nginx 就可能选它。
⚠️ 已弃用 — 该技能已拆分为两个独立技能,以提升模块化程度:**webchat-https-proxy**(HTTPS/WSS 反向代理)和 **webchat-voi...**
- 如果上游不支持 TLS 1.3,Nginx 日志中会出现
SSL_do_handshake() failed或connection reset类错误 - 搭配
proxy_ssl_verify on和有效 CA 证书可进一步防中间人,提升链路可信度 - 无需配
proxy_ssl_ciphers来限定套件:TLS 1.3 只认五种标准组合,Nginx 自动处理
配合 upstream 实现更稳的回源策略
在 upstream 块中集中管理,便于复用和故障隔离:
upstream backend_api {
server api.example.com:443;
proxy_ssl_protocols TLSv1.3;
proxy_ssl_verify on;
proxy_ssl_trusted_certificate /etc/nginx/ssl/upstream-ca.crt;
}
这样所有指向该 upstream 的请求都自动启用 TLS 1.3 回源,且校验证书链。
- 避免在每个
location里重复写proxy_ssl_*指令 -
proxy_ssl_trusted_certificate必须是 PEM 格式的 CA 证书(不是域名证书),用于验证上游身份 - 若上游用私有 CA 或自签名证书,此步骤不可省;否则
proxy_ssl_verify on会导致连接拒绝
验证是否生效
启用 Nginx 调试日志或抓包确认:
- 在
error_log中加入debug级别,搜索"SSL_do_handshake"和"TLSv1.3" - 用
tcpdump -i any port 443 -w upstream.pcap抓包,Wireshark 打开后看 Client Hello 的 Supported Versions 扩展是否含0x0304(TLS 1.3 标识) - 注意:浏览器开发者工具里的协议信息只反映客户端→Nginx 这一段,不能代表回源链路

















