如何根据 HAProxy 选择的后端 IP/服务器将证书随机发送到浏览器?

如何根据 HAProxy 选择的后端 IP/服务器将证书随机发送到浏览器?

我是 HAProxy 的新手,我试图实现这一点。我有 4 台虚拟机,其中一台有 HAProxy 服务器,另外 3 台虚拟机有 Apache httpd 服务器。我test.html在所有三台服务器上都有。当用户点击时https://haproxy_ip/test.html,文件可能会从任何服务器传送。

我已经在每个虚拟机中生成了单独的 SSL 证书(通过引用这些 URL如何在 Apache CentOS 上启用 https - TechRepublichttps://www.suse.com/support/kb/doc/?id=000018152) 并将 pem 和 key 文件复制到 HAProxy VM。现在,所有三个 pem 文件均可在/etc/haproxy/目录下使用。

我已配置ssl crt-list通过 HAProxy 选择相应的 SSL 证书,下面是 crt-list.txt 的样子;

/etc/haproxy/testserver1.pem testserver1
/etc/haproxy/testserver2.pem testserver2
/etc/haproxy/testserver3.pem testserver3

我正在寻找的是,当用户在浏览器中请求时https://haproxy_ip/test.html,每次需要传递的证书应该基于HAProxy选择的后端服务器。

HAProxy 可以实现这个功能吗?或者支持吗?如果可以,有人能帮我吗?

以下是我当前的配置;

global
    maxconn 50000
    log /dev/log local0
    log /dev/log local1 notice
    user root
    group root
    stats timeout 30s
    nbproc 2
    cpu-map auto:1/1-4 0-3
    ssl-default-bind-ciphers ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256
    ssl-default-bind-options ssl-min-ver TLSv1.2 no-tls-tickets
    daemon

defaults
    timeout connect 5000ms
    timeout client 50000ms
    timeout server 50000ms

frontend ft_http
    bind :80
    mode http
    default_backend bk_http

frontend ft_https
    bind :443 ssl crt-list /etc/haproxy/crt-list.txt
    mode tcp
    default_backend bk_https

backend bk_http
    mode http
    balance roundrobin
    default-server inter 1s
    server testserver1 192.168.0.1:80 check
    server testserver2 192.168.0.2:80 check
    server testserver3 192.168.0.3:80 check

backend bk_https
    mode tcp
    balance roundrobin
    stick-table type ip size 200k expire 1m
    default-server inter 1s
    server testserver1 192.168.0.1:443 check
    server testserver2 192.168.0.2:443 check
    server testserver3 192.168.0.3:443 check

谢谢。

编辑

让我解释一下我为什么要实现这个目标;

假设我有两个客户(两个不同的域名),他们把 DNS 条目设置为 CNAME,这样当用户输入https://myapp.customer1.com或者https://myapp.customer2.com在浏览器中,它会重定向到我的服务器,我在那里安装了 HAProxy。另外,假设客户由于某种原因没有存储/不愿意在他的服务器中存储子域证书。在这种情况下,我需要在我的服务器中存储和维护这些证书。由于两个客户使用不同的服务器,我不能使用通配符证书。另外,假设我也不喜欢 SANS。

在这种情况下,如何使用 HAProxy 从我的服务器提供相应的证书(根据域用户请求)?希望您了解我想要实现的目标。

答案1

您无法通过 IP 地址访问 HAProxy。

您将获得一张证书customer1.example.com和第二张证书customer2.example.com

配置 DNS 条目(或仅在文件中测试时) ,hosts以便 指向 HAProxy 的 IP 地址customer2.example.comcustomer1.example.com

您可以customer1.example.comcustomer2.example.comcrt-list

SNI 将确保当您请求https://customer1.example.com证书时customer1.example.com使用,并且当您请求https://customer2.example.com证书时customer2.example.com

当您请求时,https://ip-address您没有有效的证书。我之前解释过: 为什么即使在 HAProxy 中配置了多个证书,浏览器也始终只显示一个服务器的证书?

如果你想让网络浏览器知道它连接到哪个后端,你不能在前端使用证书来做到这一点,而是通过设置例如标头和/或 cookie 来实现

相关内容