我是 HAProxy 的新手,我试图实现这一点。我有 4 台虚拟机,其中一台有 HAProxy 服务器,另外 3 台虚拟机有 Apache httpd 服务器。我test.html
在所有三台服务器上都有。当用户点击时https://haproxy_ip/test.html
,文件可能会从任何服务器传送。
我已经在每个虚拟机中生成了单独的 SSL 证书(通过引用这些 URL如何在 Apache CentOS 上启用 https - TechRepublic和https://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.com
customer1.example.com
您可以customer1.example.com
在customer2.example.com
crt-list
SNI 将确保当您请求https://customer1.example.com
证书时customer1.example.com
使用,并且当您请求https://customer2.example.com
证书时customer2.example.com
当您请求时,https://ip-address
您没有有效的证书。我之前解释过:
为什么即使在 HAProxy 中配置了多个证书,浏览器也始终只显示一个服务器的证书?
如果你想让网络浏览器知道它连接到哪个后端,你不能在前端使用证书来做到这一点,而是通过设置例如标头和/或 cookie 来实现