HAproxy SSL 握手失败

HAproxy SSL handshake failure

当我使用 HAproxy 作为负载平衡器时,在 HTTP 终止模式下我跟踪它的日志

(tail -f /var/log/haproxy.log)。出现2种日志

[time] frontend_name/1: SSL handshake failure

[time] frontend_name~ message

frontend_name 是在 /etc/haproxy/haproxy.cfg

中跟随前端关键字配置的名称

我不知道日志消息中的/1~是什么,为什么日志中出现SSL握手失败有~ 有人可以帮我解释和修复这个错误吗? 谢谢!

前端名称后的

~ 表示已使用 SSL/TLS
建立连接 您可以在 table 的 %ft 条目中找到对它的引用:https://cbonte.github.io/haproxy-dconv/2.4/configuration.html#8.2.4
关于 /1frontend_name/1: SSL handshake failure:
我在文档中找不到它,但通过试验我发现它是前端的端口号,尝试连接到该端口但 SSL 握手失败。
对于配置:

frontend frontend_name
  bind *:443,*:444 ssl crt <path_to_cert>
  bind *:445 ssl crt <path_to_cert> no-tlsv13

如果我将 TLS1.3 连接到端口 445(例如 openssl s_client -connect 127.0.0.1:445 -tls1_3),我将得到:

frontend_name/3: SSL handshake failure

因为 445 是此前端中列出的 3. 端口。

[更新]
我发现了更多。 Error log format说明frontend_name/1中的/1bind_name,可以声明:

bind *:443,*:443 ssl crt <path_to_cert> no-tlsv13 name bind_ssl_foo

将导致 frontend-name/bind_ssl_foo: SSL handshake failure
很遗憾,我们无法更改错误日志格式。

要了解更多信息,我们必须使该连接成功,这很可能需要我们降低安全性(仅用于调试!)。普通客户端仍将协商最高安全性,TLS 1.2 或 1.3。

bind *:443 ssl crt <path_to_cert> ssl-min-ver TLSv1.0

因为 ssl-min-ver 的 haproxy 2.2 默认是 TLSv1.2。
第二步是通过将 %sslv %sslc%[ssl_fc_cipherlist_str] 附加到您的日志格式来记录客户端发送的 SSL 版本、协商密码和可能的整个密码列表:

log-format "your_log_format_here %sslv %sslc %[ssl_fc_cipherlist_str]"

如果您没有自己的日志格式,您可以扩展 HTTP 格式:

log-format "%ci:%cp [%tr] %ft %b/%s %TR/%Tw/%Tc/%Tr/%Ta %ST %B %CC %CS %tsc %ac/%fc/%bc/%sc/%rc %sq/%bq %hr %hs %{+Q}r %sslv %sslc %[ssl_fc_cipherlist_str]"

要使用ssl_fc_cipherlist_str,我们需要在全局部分设置tune.ssl.capture-cipherlist-size 800,因为默认值为0。 sslv是连接的SSL/TLS版本客户端。
sslc是SSL/TLS连接的密码客户端。 ssl_fc_cipherlist_str 是协商 SSL/TLS 连接时提供的密码列表客户端。它可以很长。如果您特别好奇,请使用。

这将像这样附加到您的日志信息中:

TLSv1 ECDHE-RSA-AES256-SHA ECDHE-ECDSA-AES256-SHA,ECDHE-RSA-AES256-SHA,DHE-RSA-AES256-SHA,ECDHE-ECDSA-AES128-SHA,ECDHE-RSA-AES128-SHA,DHE-RSA-AES128-SHA,AES256-SHA,AES128-SHA,TLS_EMPTY_RENEGOTIATION_INFO_SCSV

通过 IP 将以前的错误与当前条目进行匹配,您将知道他们使用的是什么 TLS 版本和密码。然后决定是调整你的密码还是强制这个客户端升级他们的 SSL 软件。

所以下面所有需要的更改:

global
  log /dev/log daemon
  tune.ssl.capture-cipherlist-size 800

frontend frontend_name
  bind *:443 ssl crt <path_to_cert> ssl-min-ver TLSv1.0
  log-format "%ci:%cp [%tr] %ft %b/%s %TR/%Tw/%Tc/%Tr/%Ta %ST %B %CC %CS %tsc %ac/%fc/%bc/%sc/%rc %sq/%bq %hr %hs %{+Q}r %sslv %sslc %[ssl_fc_cipherlist_str]"
  mode http
  (...)

同样,如果此连接错误对您来说确实是个问题,则降低安全性仅用于调试。