複数のSSL証明書用にHAProxyを構成する方法


8

2つの異なるSSL証明書でHAProxyを構成する必要があります

  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

上記の省略さcrtれた構成では、bind行に2つのディレクティブをリストしていますが、完全な構成では1つしかありません...それは意図されたものですか?その証明書にはSANエントリがありますか、それともワイルドカードですか?
GregL 2015

行を削除した後、申し訳ありませんが、私は構成を取りました。私の目標は、個々のドメインに対して個々のssl証明書を許可することであり、私はHAProxyにかなり慣れています。上記の設定に2番目の証明書を追加しました。
merlin

間違った証明書を提供している場所で、どのクライアントを使用していますか?
GregL 2015

回答:


9

HAProxy 1.6以降を実行していることを確認します

この質問は少し古いですが、OPと同様の構成でまったく同じ問題に遭遇しました。

HAProxy 1.5は、オプションの複数のcrt構文を受け入れbindます。ただし、応答時には最初の証明書のみを使用します。

HAProxy 1.6は、呼び出し元の要求に基づいて証明書で応答するように見えます。これはsni、設定に特別なACL を必要としないようです。

1.6で動作するが1.5のcert2.pem要求に応答するときに使用できない例を次に示しますplace2.com

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.comhaproxyが提示する証明書を決定するために必要なSNI情報を送信するために、追加のパラメーター()が必要になることに注意してください。


あなたの答えが理解できるかどうかわかりません。上記の例では、次の行を使用しています。1つのバックエンドで複数のSSL証明書を使用できますか?
マーリン2015

1
はい、あなたは私の答えを理解していません。現在の構成ではなく、テスト方法に疑問があります。
ウォンブル

私が理解している限り、私が提示した構成にはあまりテストがありません。テストする唯一のことは、指定されたドメインがhttpsを通過したかどうか、および通過していない場合はhttpsにリダイレクトすることです。しかし、これは問題ではありません。特定の証明書を対応するURL専用にする方法を知りたいです。
マーリン2015

3
「しかし、サーバーは両方のドメインについて言及された最初の証明書を引き続き使用します」-あなた自身のテストではないにしても、あなたの質問におけるこの主張の根拠は何ですか?
ウォンブル
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.