Nginx反向代理WebFlow站点出现SSL握手失败问题求助
问题详情
已配置Nginx反向代理,将https://webflow.example.com(浏览器可正常访问,无SSL错误)代理到https://example.com/blog,但访问目标地址时触发SSL握手失败错误。
当前Nginx配置:
server { listen 80; listen [::]:80; server_name example.com; location /blog/ { proxy_pass https://webflow.example.com/; } }
报错信息:
SSL_do_handshake() failed (SSL: error:0A000410:SSL routines::sslv3 alert handshake failure:SSL alert number 40) while SSL handshaking to upstream, client: 10.123.196.124, server: linkme.dev, request: "GET /blog/ HTTP/1.1", upstream: "https://172.67.4.111:443/", host: example.com
解决办法
1. 指定兼容的SSL协议与密码套件
WebFlow服务器大概率只支持现代TLS版本,默认Nginx配置可能包含过时协议(如SSLv3、TLSv1.0)导致握手失败。在location块中添加以下配置:
location /blog/ { proxy_pass https://webflow.example.com/; proxy_ssl_protocols TLSv1.2 TLSv1.3; proxy_ssl_ciphers HIGH:!aNULL:!MD5; }
proxy_ssl_protocols:限定仅使用安全的TLS版本,排除过时协议。proxy_ssl_ciphers:配置符合现代安全标准的密码套件,匹配WebFlow服务器要求。
2. 启用SNI支持
代理HTTPS上游时,Nginx需发送SNI信息,否则上游服务器无法返回对应域名的证书。显式启用SNI:
location /blog/ { proxy_pass https://webflow.example.com/; proxy_ssl_server_name on; }
proxy_ssl_server_name on会让Nginx在握手时传递上游域名,确保WebFlow返回正确证书。
3. 升级Nginx版本
旧版Nginx对TLSv1.3或SNI的支持可能存在缺陷,建议升级到1.18及以上稳定版本,提升现代SSL协议兼容性。
4. 验证证书信任(测试用)
若浏览器可访问但Nginx报错,可能是Nginx信任池与浏览器不一致。可临时禁用证书验证排查问题(生产环境禁止使用):
location /blog/ { proxy_pass https://webflow.example.com/; proxy_ssl_verify off; }
若问题解决,需将WebFlow的根证书添加到Nginx信任池中,确保生产环境的安全性。
总结
优先尝试添加proxy_ssl_protocols和proxy_ssl_server_name配置,这是解决SSL alert 40的最常见方案。若无效,再排查Nginx版本和证书信任问题。
内容的提问来源于stack exchange,提问作者Ashwini

