You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.23 09:57:44