proxy_ssl_protocols 用于控制 Nginx 到上游 HTTPS 服务的 TLS 版本,设为 TLSv1.3 可强制启用该协议,但需后端真实支持、正确配置 proxy_ssl_verify 和 proxy_ssl_trusted_certificate,并配合 TLS 1.3 专用 cipher。

proxy_ssl_protocols 是 Nginx 作为反向代理时,控制它与上游服务器(即后端服务)建立 HTTPS 连接所允许的 TLS 协议版本的指令。它不作用于客户端到 Nginx 的连接(那是 ssl_protocols 的职责),而是专用于 Nginx 主动发起的、到后端 HTTPS 服务的出站连接。
要通过 proxy_ssl_protocols 强制启用 TLS 1.3 来提升反代链路安全,核心在于:确保 Nginx 与后端服务之间只使用 TLS 1.3 握手,杜绝降级到 TLS 1.2 或更旧版本的风险。但这必须建立在后端真实支持且配置就绪的前提下,否则会导致连接失败。
以下是你需要关注的关键点和操作方式:
确认上游服务实际支持 TLS 1.3
Nginx 不会“强制”后端升级——它只能按你指定的协议发起协商。如果后端(如另一台 Nginx、API 服务、云函数等)未启用 TLS 1.3 或 OpenSSL 版本过低(proxy_ssl_protocols TLSv1.3;,连接也会直接失败(常见报错:SSL_do_handshake() failed 或 tlsv1 alert protocol version)。
务必先验证:
- 使用
openssl s_client -connect upstream.example.com:443 -tls1_3测试能否成功完成 TLS 1.3 握手 - 检查后端服务的 OpenSSL 运行时版本(
nginx -V | grep OpenSSL或后端进程对应命令)
正确配置 proxy_ssl_protocols 指令
在 location 或 upstream 块中设置,仅保留 TLSv1.3:
location /api/ {
proxy_pass https://backend;
proxy_ssl_protocols TLSv1.3; # 关键:不写 TLSv1.2,不加空格或多余字符
proxy_ssl_verify on; # 强烈建议开启证书校验
proxy_ssl_trusted_certificate /etc/ssl/certs/ca-bundle.crt;
}⚠️ 注意:
-
proxy_ssl_protocols不继承http或server块中的ssl_protocols,必须显式声明 - 不要混用旧协议(如
TLSv1.2 TLSv1.3),否则无法达成“强制”效果 - 若后端是自签名或私有 CA 签发证书,必须通过
proxy_ssl_trusted_certificate明确指定可信根证书,否则proxy_ssl_verify on会拒绝连接
配合 cipher 与会话参数加固链路
TLS 1.3 的密钥交换和加密套件是固定的(RFC 8446 规定仅 5 种组合),但 Nginx 仍需避免配置冲突:
- 删除所有 TLS 1.2 风格 cipher(如
ECDHE-RSA-AES256-GCM-SHA384),它们对 TLS 1.3 无效且可能干扰协商 - 推荐精简配置(放在
location或upstream内):proxy_ssl_ciphers TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256:TLS_AES_128_GCM_SHA256; proxy_ssl_prefer_server_ciphers off; # TLS 1.3 中该指令已无实际意义,可省略 proxy_ssl_session_reuse on; # 启用会话复用,降低 1-RTT 握手开销
日志与故障排查不可少
启用 $upstream_http_x_ssl_protocol(需后端返回该 header)或通过 error_log 级别 debug 观察实际协商结果:
error_log /var/log/nginx/proxy_debug.log debug;
若出现 SSL_do_handshake() failed,优先检查:
- 后端是否监听 443 且证书有效
-
proxy_ssl_trusted_certificate路径是否正确、权限是否可读 - 是否误将
proxy_ssl_protocols写在了server块顶层(无效位置)
不复杂但容易忽略


















