Server 使用SSL和SNI返回HAProxy后端/服务器到特定目标;OpenSSL错误[0x14094410]ssl3“读取字节:sslv3警报握手失败”;

Server 使用SSL和SNI返回HAProxy后端/服务器到特定目标;OpenSSL错误[0x14094410]ssl3“读取字节:sslv3警报握手失败”;,server,openssl,backend,haproxy,sni,Server,Openssl,Backend,Haproxy,Sni,我已经设置了一个HAProxy实例,它应该: 卸载前端上的SSL 在后端加载SSL 使用SNI进行上游连接和健康检查 对于本演示,我创建了一个缩短的HAProxy配置,如下所示: global log 127.0.0.1 local0 maxconn 8000 user nobody group nogroup daemon debug #quiet stats s

我已经设置了一个HAProxy实例,它应该:

  • 卸载前端上的SSL
  • 在后端加载SSL
  • 使用SNI进行上游连接和健康检查
对于本演示,我创建了一个缩短的HAProxy配置,如下所示:

global
        log 127.0.0.1 local0
        maxconn 8000
        user nobody
        group nogroup
        daemon
        debug
        #quiet
        stats socket /var/run/haproxy.sock mode 600 level admin
        ssl-default-bind-options no-sslv3
        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-options no-sslv3
        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
        tune.ssl.default-dh-param 2048

defaults
        log global
        mode http
        balance roundrobin
        option dontlognull
        option abortonclose
        option redispatch
        retries 3
        maxconn 18000
        timeout connect 30s
        timeout client 30s
        timeout server 30s


frontend test.local
        bind 0.0.0.0:8443
        reqadd X-Forwarded-Proto:\ https
        option forwardfor

        acl api_statusio path_beg -i /status/1.0
        use_backend api_statusio if api_statusio

backend api_statusio
        option httpchk GET / HTTP/1.1\r\nHost:\ letsencrypt.status.io
        http-request set-header Host letsencrypt.status.io
        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)
例如,使用google.com作为上游,但没有status.io-resource(letsencrypt.status.io只是一个示例):

root@edc5cab629ae:/#haproxy-f./haproxy.cfg
[警告]274/160954(2642):解析[./haproxy.cfg:37]:“reqadd”指令已被弃用,取而代之的是“http请求添加头”,将在下一版本中删除。
[警告]274/160954(2642):模式与和不兼容。只保留。
可用的投票系统:
epoll:pref=300,测试结果正常
轮询:pref=200,测试结果正常
选择:pref=150,测试结果失败
总计:3(2可用),将使用epoll。
可用过滤器:
[SPOE]SPOE
[COMP]压缩
[缓存]缓存
[跟踪]跟踪
使用epoll()作为轮询机制。
fd[0013]OpenSSL错误[0x14094410]ssl3_读取字节:sslv3警报握手失败
[警告]274/160955(2642):服务器api_statusio/test2关闭,原因:套接字错误,信息:“SSL握手失败”,检查持续时间:111ms。剩下0台活动服务器和0台备份服务器。0个会话处于活动状态,0个会话重新排队,队列中剩余0个会话。
[警报]274/160955(2642):后端“api_statusio”没有可用的服务器!
fd[0014]OpenSSL错误[0x14094410]ssl3_读取字节:sslv3警报握手失败
fd[0014]OpenSSL错误[0x14094410]ssl3_读取字节:sslv3警报握手失败
如果我使用openssl s_客户端作为快速检查,这似乎可以正常工作

这是用以下方法测试的:

  • HAProxy 2.0.3+OpenSSL 1.1.1c 2019年5月28日(Docker HAProxy:最新版本)
  • HAProxy 1.8.8+OpenSSL 1.1.1 2018年9月11日(Ubuntu 18.04)

有什么想法吗?

freenode上的一位友好用户#haproxy指出

        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)
应该是

        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 letsencrypt.status.io
这很有效。解决了这个问题后,我遇到了一个类似的问题,就是在多个上游使用服务器模板,这在这里描述:(但这是一个不同的主题)

        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 letsencrypt.status.io