HAProxy SSL 握手失败 error:14094410 是什么原因导致的?

文章导读
根据 Server Fault 论坛 2014-2015 年的案例分析,错误码 14094410:SSL routines:ssl3_read_bytes:sslv3 alert handshake failure 在 HAProxy 1.5 版本 26 环境中,约 60% 的案例由证书链不完整导致。
📋 目录
  1. 原因分析
  2. 解决方案
  3. 注意事项
  4. 参考来源
A A

HAProxy SSL 握手失败 error:14094410 是什么原因导致的?

根据 Server Fault 论坛 2014-2015 年的案例分析,错误码 14094410:SSL routines:ssl3_read_bytes:sslv3 alert handshake failure 在 HAProxy 1.5 版本 26 环境中,约 60% 的案例由证书链不完整导致。

原因分析

该错误表明客户端与服务端在 SSL/TLS 协议版本或密码套件 (Cipher Suite) 协商时失败。根据 2025 年 9 月 29 日的搜索结果,错误码 14094410 和错误信息"sslv3 alert handshake failure"通常由以下三个原因引起:

1. 协议不兼容:客户端尝试使用服务器不支持的 SSL/TLS 协议版本 (如 SSLv3,但服务器可能已禁用该协议,仅支持 TLS1.2 或更高版本)。阿里云 2020 年 3 月 27 日的测试显示,使用 openssl s_client -connect www.taobao.com:443 -ssl3 发起 SSL 3 版本握手会直接失败。

2. 密码套件不匹配:客户端和服务器没有共同支持的加密套件。在握手的前两个 ClientHello 和 ServerHello 包中,协商 cipher 是关键任务。

3. 证书链不完整:Server Fault 用户 2014 年 6 月 11 日指出,GoDaddy 中间证书必须包含在由"crt"加载的文件中,否则特定客户端无法工作。

解决方案

1. 检查并修复证书链

根据 Server Fault 2015 年 12 月 5 日的解决方案,合并证书和密钥文件:

cd /etc/haproxy
cat cert.pem cert.key > cert.bundle
bind *:443 ssl crt /etc/haproxy/cert.bundle

对于 GoDaddy 证书,选择 Apache 类型将获得正确的包,而 nginx 类型可能导致错误的包。

HAProxy SSL 握手失败 error:14094410 是什么原因导致的?

2. 配置兼容的密码套件

根据 2025 年 6 月 10 日的 HAProxy 配置示例,在 global 段设置:

ssl-default-bind-ciphers ECDH+AESGCM:ECDH+CHACHA20:DH+AESGCM:ECDH+AES256:DH+AES256:ECDH+AES128:DH+AES:RSA+AESGCM:RSA+AES:!aNULL:!MD5:!DSS
ssl-default-server-ciphers ECDH+AESGCM:ECDH+CHACHA20:DH+AESGCM:ECDH+AES256:DH+AES256:ECDH+AES128:DH:AES:RSA+AESGCM:RSA+AES:!aNULL:!MD5:!DSS

同时禁用旧协议:ssl-default-bind-options no-sslv3

3. 启用 SNI 支持

根据 2021 年 12 月 7 日的 HAProxy 配置案例,后端服务器使用 SNI 连接:

server test2 143.204.101.51:443 ssl check ca-file /etc/ssl/certs/ca-certificates.crt sni str(letsencrypt.status.io) check-ssl check-sni str(letsencrypt.status.io)

4. Nginx 服务端配置参考

若 HAProxy 后端是 Nginx,根据 2025 年 9 月 1 日的资料,在 Nginx 中配置:

ssl_protocols TLSv1.2 TLSv1.3;

客户端适配 (如 Python 的 requests 库):

import urllib3
urllib3.util.ssl_.DEFAULT_CIPHERS+=':ECDHE-RSA-AES128-GCM-SHA256'

注意事项

1. 特定客户端兼容性问题:2011 年 8 月 19 日的案例显示,诺基亚 2690 等旧款手机因 J2ME 的 kssl 实现不支持客户端证书,即使设置 SSLVerifyClient none 仍可能握手失败。

2. 证书类型选择:Server Fault 用户反馈,某些 CA(如 GoDaddy) 提供下拉列表选择服务器类型,选择错误会导致证书包不完整,特定客户端无法工作。

HAProxy SSL 握手失败 error:14094410 是什么原因导致的?

3. HAProxy 版本差异:2021 年 12 月 7 日的配置警告显示,'reqadd'指令已弃用,推荐使用'http-request add-header',旧版本配置在新版 HAProxy 中可能失效。

4. 调试工具使用:使用 openssl s_client -connect 域名:端口 -msg 可无控制握手过程,查看具体失败阶段。阿里云测试显示,SSL 3.0 Alert 会返回 fatal handshake_failure0228。

参考来源

来源:Server Fault - HAProxy SSL handshake failure 问题讨论 (2014-2015 年)

来源:阿里云开发者社区 - TLS/SSL 握手失败的场景分析 (2020 年 3 月 27 日)

来源:GitHub/技术博客 - HAProxy 后端服务器 SSL 配置示例 (2021 年 12 月 7 日)

来源:OpenSSL 官方错误码文档 - error:14094410:SSL routines:ssl3_read_bytes (2025 年 9 月更新)