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
关于 /1
在 frontend_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
中的/1
是bind_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
(...)
同样,如果此连接错误对您来说确实是个问题,则降低安全性仅用于调试。
当我使用 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
关于 /1
在 frontend_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
中的/1
是bind_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
(...)
同样,如果此连接错误对您来说确实是个问题,则降低安全性仅用于调试。