Nginx TCP Stream模式下TLSv1.0连接重置且ssl_protocols配置不生效问题
您好,我使用的Nginx 1.19.2基于OpenSSL 1.1.1g编译,默认支持TLSv1.0/1.1/1.2/1.3版本。我的后端业务应用仅接受TLSv1.2及TLSv1.3连接,且可主动将收到的TLSv1.0连接重协商至高版本协议。当我将Nginx以TCP Stream四层代理模式部署在应用前端时,通过抓包发现Nginx会直接重置TLSv1.0连接,并未像后端应用一样发起重协商升级流程。我在stream块的server配置中新增了ssl_protocols TLSv1.2、ssl_ciphers等配置试图限制支持的协议版本,但测试发现配置未生效,TLSv1.0仍可正常建立连接。特此咨询两个问题:1. 为何Nginx未对TLSv1.0连接发起重协商而是直接重置?2. 为何我配置的ssl_protocols参数未生效?盼复。
问题解答
1. Nginx直接重置TLSv1.0连接而非发起重协商的原因
核心逻辑如下:
- TLS协议的版本协商仅在首次握手的Client Hello阶段完成,标准协议没有「低版本握手成功后再重协商升级至高版本」的设计,你提到的后端业务能实现该逻辑属于非标准的定制实现,不符合TLS官方规范。
- 如果你在Nginx Stream层开启了SSL终结,当客户端发起TLSv1.0版本的握手请求时,Nginx会在校验版本适配性后直接返回握手失败告警,随后断开连接,根本不会进入后续的重协商流程,自然不可能实现低版本升级的非标逻辑。
- 如果你使用的是纯TCP透传模式未开启SSL终结,Nginx不会解析TLS报文内容,此时出现连接重置是后端返回的重置报文被Nginx透传返回给了客户端,和Nginx本身逻辑无关。
2. ssl_protocols配置不生效的常见原因
按优先级排序排查:
- 编译Nginx时未加入
ngx_stream_ssl_module模块:需要在编译时添加--with-stream --with-stream_ssl_module参数才能启用Stream层的SSL相关能力,未编译该模块的情况下,所有ssl_开头的配置都会被Nginx直接忽略,Stream会以纯TCP透传模式运行,客户端直接和后端完成TLS握手,你的版本限制自然不会生效。 - 未在对应server块的监听配置中开启SSL开关:需要在
listen配置项后添加ssl参数(例如listen 443 ssl;),或者显式配置ssl on;,否则ssl_protocols等SSL相关配置不会被激活。 - 配置修改后未正确重载:执行
nginx -t先校验配置是否存在语法错误,确认无报错后执行nginx -s reload重载配置后再测试。 - 存在更高优先级的配置覆盖:检查全局stream块、其他关联server块是否有冲突的
ssl_protocols配置,同层级下后加载的配置会覆盖先加载的配置。
内容的提问来源于stack exchange,提问作者Gary C. New
相关产品推荐
相关产品推荐

