部署在AWS ECS的Nginx TLSv1.3未返回close_notify问题咨询
解决Nginx在TLSv1.3下发送close_notify的配置方案及回归测试清单
一、Nginx配置修改方案
针对TLSv1.3下Nginx未发送close_notify的问题,可通过以下配置调整强制触发该报文:
关键配置项说明
- 开启close_notify强制发送:添加
ssl_send_close_notify on;指令(Nginx 1.19.8及以上版本支持),该配置会让Nginx在关闭任何TLS版本的连接时,主动发送close_notify告警。 - 优化上游连接管理:确保Nginx与上游应用的连接关闭流程合规,避免提前断开TLS连接:
- 启用HTTP/1.1长连接,避免短连接导致的异常关闭;
- 配置合理的超时时间,减少因超时触发的强制断开。
修改后的完整配置示例
server { listen 443 ssl; server_name $mtls; access_log /dev/stdout main; ssl_certificate "/etc/nginx/${mtls}.crt"; ssl_certificate_key "/etc/nginx/${mtls}.key"; ssl_client_certificate "/etc/nginx/ca.crt"; ssl_prefer_server_ciphers ${ssl_ciphers_flag}; ssl_protocols TLSv1.2 TLSv1.3; ssl_verify_client on; ssl_verify_depth 2; ssl_dhparam "/etc/nginx/dhparam.pem"; ssl_ciphers ${ssl_ciphers_list}; ssl_buffer_size 8k; # 强制发送close_notify报文 ssl_send_close_notify on; location / { # 启用HTTP/1.1长连接 proxy_http_version 1.1; proxy_set_header Connection ""; proxy_ssl_server_name on; proxy_set_header Client_Hostname ${ssl_server_name}; proxy_set_header Cert_Thumbprint ${san}; proxy_set_header Host ${ssl_server_name}; proxy_set_header x-apigw-api-id ${mtls_apigateway_id}; # 配置超时时间,避免意外断开 proxy_connect_timeout 30s; proxy_send_timeout 30s; proxy_read_timeout 60s; proxy_pass https://${vpc_endpoint_dns}/${DEPLOY_ENV}/; } }
二、回归测试清单
修改配置后需覆盖以下测试场景,确保业务兼容性与配置有效性:
- TLSv1.3连接关闭验证
- 使用OpenSSL 3.x客户端执行命令:
openssl s_client -connect your-domain:443 -tls1_3,发起请求后主动关闭连接,抓包确认Nginx发送了close_notify报文; - 检查客户端日志,确认不再出现"意外EOF"类错误。
- 使用OpenSSL 3.x客户端执行命令:
- TLSv1.2兼容性验证
- 使用OpenSSL 1.x客户端执行命令:
openssl s_client -connect your-domain:443 -tls1_2,验证连接关闭时close_notify正常发送,原有业务逻辑无异常。
- 使用OpenSSL 1.x客户端执行命令:
- 核心业务功能测试
- 覆盖所有核心API接口的正常请求、参数错误、权限拒绝等场景,验证返回结果符合预期,无连接中断导致的异常。
- 长连接场景测试
- 模拟客户端保持长连接并发起多次请求,验证连接正常复用,最终关闭时close_notify正常发送,无资源泄漏。
- 超时场景测试
- 模拟上游服务响应超时,验证Nginx按配置超时时间处理连接,关闭时仍发送close_notify,客户端无意外EOF报错。
- MTLS身份认证验证
- 携带合法/非法客户端证书发起请求,验证身份认证流程正常,连接关闭不受MTLS配置影响。
内容的提问来源于stack exchange,提问作者Amol Kshirsagar
相关产品推荐
相关产品推荐

