HAProxy配置两个不同域名SSL证书出现冲突问题求助
HAProxy配置两个不同域名SSL证书出现冲突问题求助
嘿,我碰到过好几个类似的问题,咱们来一步步解决你这个HAProxy证书冲突的事儿~
首先得搞明白问题出在哪儿:你当前的frontend用的是mode tcp,这种模式下HAProxy只是做纯TCP流量转发,没法解析SSL握手里的SNI(Server Name Indication)字段——这个字段就是客户端告诉服务器“我要访问哪个域名”的关键信息。所以当你把两个证书直接绑在同一个TCP端口上时,HAProxy根本不知道该返回哪个证书,只能随机选一个,就出现了你说的“访问api.xxx.com时显示yyy的证书,刷新后又正常,反过来访问yyy也出问题”的情况。
下面给你两个可行的解决方案,你可以根据自己的场景选:
方案一:用crt-list文件匹配域名与证书(适合保持TCP模式的场景)
如果你的后端Rserve是纯TCP服务,没法改成HTTP模式,那这个方案最适合:
- 先创建一个crt-list配置文件,比如
/etc/ssl/haproxy/crt-list.txt,每行对应一个域名和它的证书路径:api.xxx.com /etc/ssl/haproxy/api.xxx.pem api.yyy.com /etc/ssl/haproxy/api.yyy.pem - 修改frontend里的bind行,把原来的多个
crt参数换成crt-list:bind 10.0.1.144:443 transparent ssl crt-list /etc/ssl/haproxy/crt-list.txt - 这样HAProxy在SSL握手时会读取客户端发送的SNI字段,自动匹配对应域名的证书返回,就能解决冲突了。
方案二:切换到HTTP模式(适合后端支持HTTP协议的场景)
如果你的后端服务可以适配HTTP模式,那这个配置更直观:
- 把frontend的
mode tcp改成mode http,然后添加ACL规则匹配不同域名:frontend rserve_frontend maxconn 2000000 bind 10.0.1.144:80 transparent bind 10.0.1.144:443 transparent ssl crt /etc/ssl/haproxy/api.xxx.pem crt /etc/ssl/haproxy/api.yyy.pem mode http option httplog timeout client 10m # 匹配两个目标域名的ACL规则 acl host_api_xxx hdr(host) -i api.xxx.com acl host_api_yyy hdr(host) -i api.yyy.com # 拒绝非这两个域名的请求(可选,增强安全性) http-request deny unless host_api_xxx or host_api_yyy default_backend rserve_backend - HTTP模式下HAProxy能直接读取请求头里的Host字段,配合SNI就能精准返回对应证书,不会再出现混乱。
记得修改完配置后,用haproxy -f /path/to/your/haproxy.cfg -c验证配置语法没问题,再重启HAProxy生效哦~
备注:内容来源于stack exchange,提问作者robin
相关产品推荐
相关产品推荐

