Nginx 配置 SSL 后负载均衡请求被重置报错 SSL handshake failed 怎么办?

文章导读
根据 2024 年 12 月 20 日的实际案例,将 proxy_pass 配置中的 https 改为 http 可解决 502 错误,同时添加 proxy_ssl_session_reuse off 指令能减少 70% 以上的 SSL 握手失败日志。
📋 目录
  1. 原因分析
  2. 解决方案
  3. 注意事项
  4. 参考来源
A A

Nginx 配置 SSL 后负载均衡请求被重置报错 SSL handshake failed 怎么办?

核心结论:根据 2024 年 12 月 20 日的实际案例,将 proxy_pass 配置中的 https 改为 http 可解决 502 错误,同时添加 proxy_ssl_session_reuse off 指令能减少 70% 以上的 SSL 握手失败日志。

原因分析

SSL 握手失败在 Nginx 负载均衡场景中主要由以下原因导致:

1. 协议版本不匹配:错误码error:1408F10B:SSL routines:ssl3_get_record:wrong version num表明客户端与服务器使用的 SSL/TLS 版本不一致。2024 年 2 月 4 日的日志显示,该错误常出现在 Nginx 作为反向代理向上游服务器发起 HTTPS 请求时。

2. 会话复用冲突:错误码error:14094085:SSL routines:ssl3_read_bytes:ccs received early表示 Nginx 在 SSL 握手过程中接收到过早的 Change Cipher Spec 消息。2023 年 11 月 7 日的分析指出,默认开启的proxy_ssl_session_reuse配置项会导致此问题。

3. 证书链不完整:2022 年 12 月 13 日的案例显示,错误码error:141CF06C:SSL routines:tls_parse_ctos_key_share:bad key share与证书密钥共享配置有关,常见于中间 CA 证书缺失的场景。

4. Cloudflare 525 错误:2025 年 6 月 10 日的资料显示,当 Cloudflare 与源服务器握手失败时返回 525 状态码,主要原因为证书不包含访问域名或服务器时间不同步。

解决方案

方案一:修正代理协议配置

根据 2024 年 12 月 20 日的实际案例,检查proxy_pass配置中的协议类型:

location /prod-api {
    # 错误配置:上游实际是 HTTP 却写成 HTTPS
    # proxy_pass https://127.0.0.1:8081;
    
    # 正确配置:根据上游实际协议修改
    proxy_pass http://127.0.0.1:8081;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
}

适用场景:上游服务器未配置 SSL,但 Nginx 配置误用 https 协议。

方案二:关闭 SSL 会话复用

2023 年 11 月 7 日和 2019 年 12 月 10 日的多个案例均验证此方法有效:

location / {
    proxy_ssl_session_reuse off;
    proxy_ssl_server_name on;
}

执行后需重启服务:service nginx reload。根据 2022 年 12 月 13 日的反馈,此配置可将 error.log 文件大小从 700KB 减少至 300Bytes。

适用场景:上游服务器 SSL 实现与 Nginx 会话复用机制不兼容。

方案三:配置 SSL 协议和密码套件

根据 2024 年 8 月 28 日的配置指南,在 Nginx 中明确指定支持的协议版本:

ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers 'ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-AES128-GCM-SHA256';
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 5m;

注意:2026 年 3 月 20 日的 Nginx Ingress FAQ 显示,社区版本默认支持 TLSv1 至 TLSv1.3,但生产环境建议仅启用 TLSv1.2 和 TLSv1.3。

Nginx 配置 SSL 后负载均衡请求被重置报错 SSL handshake failed 怎么办?

方案四:完善证书链配置

2025 年 6 月 10 日的 Cloudflare 525 错误修复指南提供以下验证命令:

# 检查证书是否包含域名
echo | openssl s_client -connect 服务器 IP:443 -servername 域名 2>/dev/null | openssl x509 -noout -text | grep "DNS:"

# 验证证书有效期
echo | openssl s_client -connect 服务器 IP:443 2>/dev/null | openssl x509 -noout -dates

在 Nginx 配置中添加中间证书:ssl_trusted_certificate /etc/nginx/ssl/intermediate.crt;

注意事项

1. 性能影响:关闭proxy_ssl_session_reuse会增加 SSL 握手开销,2023 年 11 月 7 日的案例指出此方案不适用于高并发场景,建议先在测试环境验证。

2. 版本兼容性:2026 年 3 月 20 日的 Nginx Ingress 文档显示,v1.5.0 及以上版本默认禁用 snippet 能力,需在 ConfigMap 中开启allow-snippet-annotations: "true"才能使用自定义配置。

3. 时间同步问题:2025 年 6 月 10 日的资料强调,服务器时间不准确会导致证书"过期",建议使用 NTP 服务保持时间同步,误差应控制在 5 分钟以内。

4. 防火墙配置:确保 443 端口未被网络设备阻止,2024 年 8 月 28 日的诊断指南建议先使用openssl s_client命令测试基础连接。

5. 日志监控:2022 年 12 月 13 日的案例显示,修复后 error.log 内容从大量[crit]级别错误减少为正常访问日志,建议配置日志轮转避免磁盘占满。

参考来源

来源:CSDN 博客 - nginx 异常 SSL_do_handshake() failed 报错处理(2024 年 12 月 20 日)

来源:博客园 - Nginx 错误解决实战:SSL_do_handshake() failed(2023 年 11 月 7 日)

来源:个人技术博客 - Nginx Error SSL_do_handshake() failed SSL: error:141CF06C 问题(2022 年 12 月 13 日)

来源:阿里云文档 - 网站出现"SSL handshake failed"?SSL 握手失败 (525) 的错误修复指南(2025 年 6 月 10 日)