在 Haproxy 中配置多个 SSL 证书

Eri*_*ner 41 haproxy

我的 haproxy 实例服务于 2 个域(主要是为了避免主站点上的 XSS)。

规则看起来像这样

bind :443 ssl crt /etc/ssl/haproxy.pem

acl is_static   hdr_end(Host) -i example.com
acl is_api      hdr_end(Host) -i api.example.com
acl is_files    hdr_end(Host) -i example.io

redirect scheme https if !{ ssl_fc } is_static is_api
Run Code Online (Sandbox Code Playgroud)

现在 SSL/etc/ssl/haproxy.pem用作默认证书,它是example.com而非的证书example.io

如何为多个域名指定证书?

小智 76

您可以将所有证书连接到文件中haproxy1.pemhaproxy2.pem或者您可以指定一个包含所有 pem 文件的目录。

cat cert1.pem key1.pem > haproxy1.pem 
cat cert2.pem key2.pem > haproxy2.pem
Run Code Online (Sandbox Code Playgroud)

根据haproxy 文档

然后在配置上使用这样的东西:

defaults
  log 127.0.0.1 local0
  option tcplog

frontend ft_test
  mode http
  bind 0.0.0.0:443 ssl crt /certs/haproxy1.pem crt /certs/haproxy2.pem 
  use_backend bk_cert1 if { ssl_fc_sni my.example.com } # content switching based on SNI
  use_backend bk_cert2 if { ssl_fc_sni my.example.org } # content switching based on SNI

backend bk_cert1
  mode http
  server srv1 <ip-address2>:80

backend bk_cert2
  mode http
  server srv2 <ip-address3>:80
Run Code Online (Sandbox Code Playgroud)

阅读更多关于SNI

请记住,对 haproxy 的 SSL 支持正在开发阶段,而且它显然对性能有相当大的影响。

该线程中还讨论了其他解决方案:https : //stackoverflow.com/questions/10684484/haproxy-with-multiple-https-sites

希望这可以帮助。


小智 16

不再需要连接或指定证书列表,只需指定一个文件夹:

frontend public
    bind *:443 ssl crt /etc/haproxy/ssl/
Run Code Online (Sandbox Code Playgroud)

注意:确保文件夹不为空并且存在有效的 PEM 文件,否则 HAProxy 将不会运行。

  • 还要确保每个域中只有一个证书。您不能将旧证书与更新的证书放在一起,并假设 HAProxy 会选择更新的证书。(我刚刚发现这一点很困难。) (2认同)

zx1*_*986 7

也许你也可以检查一下:

/etc/ssl/private/crt-list.txt:

/etc/ssl/private/mydomain.pem
/etc/ssl/private/myotherdomain.pem
Run Code Online (Sandbox Code Playgroud)

haproxy.cfg:

frontend https-in:
  bind *:443 ssl crt-list /etc/ssl/private/crt-list.txt
Run Code Online (Sandbox Code Playgroud)

参考文献:https : //github.com/msimerson/Mail-Toaster-6/wiki/How-to-for-Multiple-Domain-SSL-Certificates-with-HaProxy