如何为多个SSL证书配置HAProxy


8

我需要为HAProxy配置两个不同的SSL证书

  1. www.example.com
  2. api.example.com

现在,我从关于serverfault的文章(在Haproxy中配置多个SSL证书)中学到了如何使用2个证书,但是服务器继续使用两个域中提到的第一个证书。

配置:

frontend apache-https
    bind 192.168.56.150:443 ssl crt /certs/crt1.pem crt /certs/cert2.pem
    reqadd X-Forwarded-Proto:\ https
    default_backend apache-http

backend apache-http
    redirect scheme https if { hdr(Host) -i www.example.com } !{ ssl_fc }
    redirect scheme https if { hdr(Host) -i api.example.com } !{ ssl_fc }
    ...

如何根据URL告诉HAProxy使用哪个证书?

完整配置:

global
    log /dev/log    local0
    log /dev/log    local1 notice
    chroot /var/lib/haproxy
    stats socket /run/haproxy/admin.sock mode 660 level admin
    stats timeout 30s
    user haproxy
    group haproxy
    daemon

    # Default SSL material locations
    ca-base /etc/ssl/certs
    crt-base /etc/ssl/private

    ssl-default-bind-ciphers ECDH+AESGCM:DH+AESGCM:ECDH+AES256:DH+AES256:ECDH+AES128:DH+AES:ECDH+3DES:DH+3DES:RSA+AESGCM:RSA+AES:RSA+3DES:!aNULL:!MD5:!DSS
    ssl-default-bind-options no-sslv3
    tune.ssl.default-dh-param 2048 // better with 2048 but more processor intensive

defaults
        log     global
        mode    http
        option tcplog
        option  dontlognull
        timeout connect 5000
        timeout client  50000
        timeout server  50000

frontend apache-http
        bind 0.0.0.0:80
        mode http
        option http-server-close                # needed for forwardfor
        option forwardfor                       # forward IP Address of client
        reqadd X-Forwarded-Proto:\ http
        default_backend apache-http
        stats enable

frontend apache-https
        bind 0.0.0.0:443 ssl crt cer1.pem cert2.pem
        reqadd X-Forwarded-Proto:\ https
        default_backend apache-http

backend apache-http
        redirect scheme https if { hdr(Host) -i db.example.com } !{ ssl_fc }
        redirect scheme https if { hdr(Host) -i api2.example.com } !{ ssl_fc }
        balance roundrobin
        cookie SERVERID insert indirect nocache
        server www-1 10.0.0.101:80 cookie S1 check
        server www-2 10.0.0.102:80 cookie S2 check
        server www-3 10.0.0.103:80 cookie S3 check

您可以发布完整的配置吗?
GregL 2015年

当然。我已经更新了问题。
梅林2015年

在上面的摘录配置中,crtbind在行上列出了两个指令,但是在完整配置中,您只有一个指令……这是故意的吗?该证书是否具有SAN条目还是通配符?
GregL

对不起我的错误,我在删除该行后接受了配置。我的目标是允许为各个域使用单独的ssl证书,而HAProxy我还很陌生。在上面列出的配置中添加了第二个证书。
梅林2015年

您在哪个客户端提供错误的证书?
GregL

Answers:


9

确保您正在运行HAProxy 1.6或更高版本

这个问题有点老了,但是我遇到了与OP类似的完全相同的问题。

HAProxy 1.5接受选项的多种crt语法bind。但是,它在响应时仅使用第一个证书。

HAProxy 1.6似乎根据呼叫者的请求响应证书。似乎sni在配置中不需要任何特殊的ACL。

这是一个适用于1.6的示例,但是cert2.pem在响应place2.com对1.5的请求时无法使用:

frontend http-in
        bind *:80
        bind *:443 ssl crt cert1.pem crt cert2.pem
        mode http

        acl common_dst hdr(Host) -m str place1.com place2.com

        use_backend be_common if common_dst

backend be_common
        # nothing special here.

2

您如何测试haproxy出示的证书?如果您使用openssl s_client,则建议它需要一个附加参数(-servername api.domain.com)来发送SNI信息,而haproxy则需要该SNI信息来决定要显示哪个证书。


我不确定是否理解您的答案。上面提到的示例使用以下行:use_backend bk_cert1 if {ssl_fc_sni my.example.com}但是我没有为这两个后端分配一个后端,并配置apache来根据URL来区分做什么。一个后端可以使用多个SSL证书吗?
梅林2015年

1
是的,你不明白我的回答。我怀疑您的测试方法,而不是您当前的配置。
womble

据我了解,我介绍的配置中没有太多测试。它唯一要测试的是指定的域是否通过https,如果不是,则重定向到https。但这不是问题。我想知道如何将特定证书专用于核心响应URL。
梅林2015年

3
“但是服务器继续使用两个域中提到的第一个证书” –如果不是您自己的测试,则在您的问题中使用此声明的依据是什么?
womble
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.