Haproxy SSL 握手失败

Haproxy SSL 握手失败

我遇到了一个问题,即某个特定客户端访问了我的 haproxy 负载均衡器。haproxy 日志中的错误消息:]

incoming_ssl/1: SSL handshake failure

有问题的客户端似乎是一些 Apache Java 客户端或 ActiveMq 服务器 - 无论哪种方式,它都是我们无法控制的远程服务器。

使用 ssldump,我看到以下几行:

11 5  0.4152 (0.1649)  C>S  Alert
    level           fatal
    value           certificate_unknown
11    0.4152 (0.0000)  C>S  TCP FIN

使用 curl / 浏览器一切看起来都很好,并且我做了一些 ssl 检查,没有报告这样的问题。

我尽可能地从 haproxy 配置文件中剥离出尽可能多的内容来诊断问题。我甚至测试过直接访问后端 (NodeJS) 服务器,结果运行良好 - 客户端可以连接。这绝对是 haproxy 的问题,我只是不知道该如何修复它。

我的基本 haproxy conf 文件如下所示:

frontend incoming_ssl
  bind *:443 ssl crt /etc/haproxy/cert.key ca-file /etc/haproxy/cert.pem ciphers ECDHE-RSA-AES256-SHA:RC4-SHA:RC4:HIGH:!MD5:!aNULL:!EDH:!AESGCM
  acl flume hdr_dom(host) -i dom.ain.com
  use_backend flume if flume

backend flume :80
  server flume 10.40.14.1:8000 weight 1 maxconn 1000 check inter 2000

也尝试过使用 ssl 后端 - 同样的的问题。也尝试过删除密码部分。

我正在使用 godaddy 证书,它似乎适用于 curl / 浏览器,只是设置起来有点烦人。

我还能做些什么来让它工作吗?我正在运行最新开发的 haproxy 1.5 版本 26,但也尝试过其他最新版本。

答案1

该客户端无法识别该证书是否有效。

Godaddy 中级证书必须包含在“crt”加载的文件中。

检查整个证书链是否正确包含在服务器的证书中:

crt /etc/haproxy/cert.key

来自 haproxy 文档中关于“crt”关键字的内容:

某些 CA(例如 GoDaddy)在获取证书时会提供不包括 HAProxy 的服务器类型下拉列表。如果发生这种情况,请务必选择 CA 认为需要中间 CA 的 Web 服务器(对于 GoDaddy,选择 Apache Tomcat 将获得正确的捆绑包,但许多其他 CA(例如 nginx)会导致错误的捆绑包,对某些客户端不起作用)。

答案2

我认为您误解了 ca-file 的作用。

做这个:

cd /etc/haproxy
cat cert.pem cert.key > cert.bundle

bind *:443 ssl crt /etc/haproxy/cert.bundle ciphers ECDHE-RSA-AES256-SHA:-RC4-SHA:HIGH:!MD5:!aNULL:!EDH

答案3

我还设置了 haproxy(2016-05),在日志中我收到了错误

ssl/1:SSL 握手失败

似乎 ssh v2 在通信之前会等待服务器,导致 haproxy 误认为它是 ssl 连接。

修复方法是将以下几行添加到〜/.ssh /配置

Host my.host.com
  HostName my.host.com
  Port 443
  User MeMe
  ProxyCommand openssl s_client -connect my.host.com:443 -quiet

相关内容