无法通过 haproxy 访问带有 SSL 的 Apache 服务器

无法通过 haproxy 访问带有 SSL 的 Apache 服务器

在我的网络中,我有一个 DNS 服务器、一个 HAProxy 服务器和 2 个 Web 服务器。当我尝试通过 haproxy(从 DNS 服务器获取域 IP)时,它给出的错误与没有它时不同。

我不太关心使用 haproxy 的 http 连接,只关心 ssl,因此修复它不是当务之急。当我在不使用 haproxy 的情况下执行下一个 curl 命令(在 /etc/hosts 中写入服务器 ip)时,我得到:

$ curl http://www.catsfood.com
<h1>www.catsfood.com</h1>
<h1>IP is: 10.0.0.14</h1>
$ curl https://www.catsfood.com -lv
*   Trying 10.0.0.14:443...
* Connected to www.catsfood.com (10.0.0.14) port 443 (#0)
* ALPN, offering h2
* ALPN, offering http/1.1
* successfully set certificate verify locations:
*  CAfile: /etc/pki/tls/certs/ca-bundle.crt
*  CApath: none
* TLSv1.3 (OUT), TLS handshake, Client hello (1):
* error:1408F10B:SSL routines:ssl3_get_record:wrong version number
* Closing connection 0
curl: (35) error:1408F10B:SSL routines:ssl3_get_record:wrong version number

通过 HAProxy 服务器:

$ curl https://www.catsfood.com -lv
*   Trying 10.0.0.17:443...
* Connected to www.catsfood.com (10.0.0.17) port 443 (#0)
...
*  subjectAltName: host "www.catsfood.com" matched cert's "www.catsfood.com"
*  issuer: C=IL; ST=Tel-Aviv; L=TLV; O=Ben Ltd; OU=Ben Ltd; CN=www.ben.com; m
*  SSL certificate verify ok.
> GET / HTTP/1.1
> Host: www.catsfood.com
> User-Agent: curl/7.76.1
> Accept: */*
> 
* TLSv1.3 (IN), TLS handshake, Newsession Ticket (4):
* TLSv1.3 (IN), TLS handshake, Newsession Ticket (4):
* old SSL session ID is stale, removing
* TLSv1.3 (IN), TLS alert, close notify (256):
* Empty reply from server
* Closing connection 0
* TLSv1.3 (OUT), TLS alert, close notify (256):
curl: (52) Empty reply from server
$ curl http://www.catsfood.com -lv
*   Trying 10.0.0.17:80...
* Connected to www.catsfood.com (10.0.0.17) port 80 (#0)
> GET / HTTP/1.1
> Host: www.catsfood.com
> User-Agent: curl/7.76.1
> Accept: */*
> 
* Empty reply from server
* Closing connection 0
curl: (52) Empty reply from server

httpd.conf文件与默认文件相同,但添加了Listen 443
haproxy.cfg:

frontend web_frontend
  bind *:80
  bind *:443 ssl crt /etc/ssl/certs/apache-selfsigned.pem
  mode tcp
  option tcplog
  default_backend web1
  acl ACL_bighead.com hdr(host) -i www.bighead.com
  acl ACL_bighead.com hdr(host) -i bighead.com
  use_backend web2 if ACL_bighead.com

backend web1
    mode tcp
    option tcplog
    option tcp-check
    server web01 10.0.0.14:443 check ssl verify none

backend web2
    mode tcp
    option tcplog
    option tcp-check
    server web02 10.0.0.15:443 check ssl verify none

ssl.conf

<VirtualHost www.bighead.com:443>
ServerAdmin [email protected]
DocumentRoot /var/www/html
ServerName www.bighead.com:443
ErrorLog /var/log/httpd/error_log
SSLEngine on
SSLCertificateFile /etc/ssl/certs/apache-selfsigned.crt
SSLCertificateKeyFile /etc/ssl/private/apache-selfsigned.key
SSLUseStapling off
</VirtualHost>



SSLCipherSuite EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH
SSLProtocol All -SSLv2 -SSLv3
SSLHonorCipherOrder On

Header always set Strict-Transport-Security "max-age=63072000; includeSubdomains"
Header always set X-Frame-Options DENY
Header always set X-Content-Type-Options nosniff

SSLCompression off
SSLUseStapling on
SSLStaplingCache "shmcb:logs/stapling-cache(150000)"

答案1

不要将域名放入<VirtualHost>标签中。这不是该字段的用途。如果您想要匹配 HTTP“Host:”标头(或 TLS SNI),请使用ServerNameServerAlias

标签<VirtualHost>采用本地 IP 地址它将与 Web 服务器上接收 HTTP 连接的任何本地地址进行匹配。此功能用于基于 IP 的虚拟主机(其中每个虚拟主机都有一个专用 IP 地址);不是用于基于名称的虚拟主机。

例如,如果域名www.bighead.com指向 HAproxy 服务器,则您的 Apache 配置将按您实际指定的方式运行<VirtualHost 10.0.0.17:443>,并且不会匹配任何连接到 Web 服务器(其地址仍然是 10.0.0.14!)。

OpenSSL 错误消息“ssl3_get_record:错误版本号”通常表示它收到的根本不是 SSL/TLS 数据包 - 例如,服务器可能发送了纯文本 HTTP 响应。(您可以使用 tcpdump 来查找。)

为什么服务器会在 HTTPS 端口上发送纯文本 HTTP 响应?可能是因为连接不匹配任何虚拟主机都会有这种情况SSLEngine On– 这可能是因为您在所有 VirtualHost 标签中都输入了错误的地址。

一般来说,除非您有特殊需要,否则所有普通 HTTP 虚拟主机都应该使用<VirtualHost *:80>,所有 HTTPS 虚拟主机都应该使用。<VirtualHost *:443>

相关内容