2つの異なるSSL証明書でHAProxyを構成する必要があります
今私は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
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.
どの証明書haproxyが提示しているかをどのようにテストしていますか? openssl s_client
を使用している場合、haproxyが提示する証明書を決定するために必要なSNI情報を送信するには、追加のパラメーター(-servername api.domain.com
)が必要になることに注意してください。