それぞれの独自のssl証明書を持つサーバーの複数のホストに対してhaproxy(1.5dev19)でACLルールを使用するにはどうすればよいですか?
1つのIPアドレスにすべて複数のドメインを持つ3つのバックエンドがあります。
nodejs(http/https/ws/wss)
nginx(http/https)(Apacheのリバースプロキシ)
Apache(http)
私はそれらの前にhaproxyを置き、それがssl接続を提供できるようにしたいと思います。 haproxy aclでそれは可能ですか、それともhaproxyの前でスタッドのようなものを使用する必要がありますか?
何かのようなもの:
frontend http-in
bind *:80
acl Host_domain1 hdr(Host) -i domain1.lt
use_backend nginx_web_http if Host_domain1
frontend http-in
bind *:443
acl Host_domain1 hdr(Host) -i domain1.lt
use_backend nginx_web_https if Host_domain1
backend nginx_web_https
mode http
ssl crt /etc/ssl/domain1/ crt ./certs/ prefer-server-cipher
option httplog
option httpclose
server nginx 192.168.2.101:8080 check
backend nginx_web_http
mode http
option httplog
option httpclose
server nginx 192.168.2.101:8080 check
Haproxyが着信リクエストごとにバックエンドごとのSSL証明書を指定できるとは思わない。むしろ、複数のドメイン名(SNI)を可能にする結合された証明書が必要になる。
SNIをhaproxyで使用するためのガイドは次のとおりです。実際には、すべての証明書はバックエンドインスタンスではなくhaproxyサーバーによってホストされています。 https://trick77.com/haproxy-and-sni-based-ssl-offloading- with-intermediate-ca /
このセクションの最後にある例も参照してください。 http://cbonte.github.io/haproxy-dconv/configuration-1.5.html#4.2-use-server
実際にこれをお使いのバージョンのhaproxyで行うことができます。私はそれについてブログに書いた ここ
次に例を示します。
global
log 127.0.0.1 local0
log 127.0.0.1 local1 notice
#log loghost local0 info
maxconn 4096
# chroot /usr/share/haproxy
user haproxy
group haproxy
daemon
#debug
#quiet
defaults
log global
mode http
option httplog
option dontlognull
retries 3
option redispatch
maxconn 2000
contimeout 5000
clitimeout 50000
srvtimeout 50000
# Host HA-Proxy web stats on Port 3306 (that will confuse those script kiddies)
listen HAProxy-Statistics *:3306
mode http
option httplog
option httpclose
stats enable
stats uri /haproxy?stats
stats refresh 20s
stats show-node
stats show-legends
stats show-desc Workaround haproxy for SSL
stats auth admin:ifIruledTheWorld
stats admin if TRUE
frontend ssl_relay 192.168.128.21:443
# this only works with 1.5 haproxy
mode tcp
option tcplog
option socket-stats
# option nolinger
maxconn 300
# use tcp content accepts to detects ssl client and server hello.
# acl clienthello req_ssl_hello_type 1 -> seems to not work
tcp-request inspect-delay 5s
tcp-request content accept if { req_ssl_hello_type 1 }
use_backend ssl_testdomain_prod if { req_ssl_sni -i www.testdomain.nl }
use_backend ssl_testdomain_stag if { req_ssl_sni -i test.testdomain.nl }
default_backend ssl_testdomain_stag
backend ssl_testdomain_stag
mode tcp
#option nolinger
option tcplog
balance roundrobin
hash-type consistent
option srvtcpka
# maximum SSL session ID length is 32 bytes.
stick-table type binary len 32 size 30k expire 30m
# make sure we cover type 1 (fallback)
acl clienthello req_ssl_hello_type 1
acl serverhello rep_ssl_hello_type 2
# use tcp content accepts to detects ssl client and server hello.
tcp-request inspect-delay 5s
tcp-request content accept if clienthello
# no timeout on response inspect delay by default.
tcp-response content accept if serverhello
# SSL session ID (SSLID) may be present on a client or server hello.
# Its length is coded on 1 byte at offset 43 and its value starts
# at offset 44.
# Match and learn on request if client hello.
stick on payload_lv(43,1) if clienthello
# Learn on response if server hello.
stick store-response payload_lv(43,1) if serverhello
#option ssl-hello-chk
server x_testdomain_stag 123.123.123.123:443
backend ssl_testdomain_prod
mode tcp
#option nolinger
option tcplog
balance roundrobin
hash-type consistent
option srvtcpka
# maximum SSL session ID length is 32 bytes.
stick-table type binary len 32 size 30k expire 30m
# make sure we cover type 1 (fallback)
acl clienthello req_ssl_hello_type 1
acl serverhello rep_ssl_hello_type 2
# use tcp content accepts to detects ssl client and server hello.
tcp-request inspect-delay 5s
tcp-request content accept if clienthello
# no timeout on response inspect delay by default.
tcp-response content accept if serverhello
# SSL session ID (SSLID) may be present on a client or server hello.
# Its length is coded on 1 byte at offset 43 and its value starts
# at offset 44.
# Match and learn on request if client hello.
stick on payload_lv(43,1) if clienthello
# Learn on response if server hello.
stick store-response payload_lv(43,1) if serverhello
#option ssl-hello-chk
server x_testdomain_prod 123.123.111.111:443
この例は、WebサーバーバックエンドでSSLを終了することを意味します。私はhaproxy sslの終了でこれを実行しようとしていません。
それがあなたの望むものであれば、おそらくこの例はそれを機能させるのに役立ちます。
use_backendの代わりにuse_serverを使用する別の例があります here