私は2つのサイト用にHAProxyを持っています。1つはパブリック、もう1つはプライベートです。
www.mysite.com private.mysite.com
Atm、私はこのようにhaproxyを使用しています:
frontend mysite_https
bind *.443 ssl crt /etc/mycert.pem ca-file /etc/myca.pem verify optional no-sslv3
mode http
acl domain_www hdr_beg(host) -i www.
acl domain_private hdr_beg(host) -i private.
acl path_ghost path_beg /ghost/
acl clientcert ssl_c_used
redirect location https://www.example.com if path_ghost !clientcert
redirect location https://www.example.com if !domain_www !clientcert
use_backend bknd_private if domain_private
use_backend bknd_www if domain_www
default_backend bknd_www
これは、クライアント証明書(オプション)を要求して続行する必要があります。ドメインがwww.example.comではなく、訪問者が正しい証明書を提供できないか、パスが/ ghost /であり、訪問者が正しい証明書を提供できない場合は、https://www.example.comにリダイレクトする必要があります。
これまでのところ、これは正常に動作します。しかし、私は、彼らが上であっ参照時に証明書を求め得続けることのSafariで、私のサイトを閲覧するMacユーザーで不満を持っhttps://www.example.com/ときブラウジング例えばFirefoxが唯一尋ね一方//private.example:HTTPS .com /またはhttps://www.example.com/ghost/。
どうやらこれはSafariの動作方法だけなので、修正できません。私のアイデアは、SNIを使用して異なるフロントエンド間で分割することでした
frontend mysite_https
bind *.443 ssl crt /etc/mycert.pem no-sslv3
frontend private_https
bind *.443 ssl crt /etc/mycert.pem ca-file /etc/myca.pem verify optional no-sslv3
もちろんそれはうまくいきません
a。パブリックIPが1つしかないポート443で2つのフロントエンドをリッスンすることはできません。「use_frontend if domain_www」またはそのようなものを言う方法をまだ見つけていません。(use_backendまたはuse-serverのみ)
3台のhaproxyサーバーでも試してみました
frontend haproxy-sni
bind *:443 ssl crt /etc/mycert.pem no-sslv3
mode tcp
tcp-request inspect-delay 5s
tcp-request content accept if { req.ssl_hello_type 1 }
acl domain_www ssl_fc_sni_end -i www.example.com
use-server server1 haproxy-private.lan if !domain_www
use-server server2 haproxy-public.lan if domain_www
これは機能しますが、ここでの問題はhaproxy-privateがクライアント証明書を要求するが、要求がブラウザーに到達しないことです。どういうわけかhaproxy-sniはリクエストを破棄します。
また、私は現在、3つのhaproxyサーバーを使用していますが、これは望ましくありません(ただし、より良い解決策が見つからない場合の可能なオプションです)。
できれば私はこのようなものを望んでいます(本当の選択肢がわからない)。
frontend mysite_https
bind *.443 ssl crt /etc/mycert.pem no-sslv3
mode http
acl domain_www hdr_beg(host) -i www.
acl domain_private hdr_beg(host) -i private.
acl path_ghost path_beg /ghost/
ssl_options ca-file /etc/myca.pem verify optional if !www_domain # made up!
ssl_options ca-file /etc/myca.pem verify optional if !path_ghost # made up!
acl clientcert ssl_c_used
redirect location https://www.example.com if path_ghost !clientcert
redirect location https://www.example.com if !domain_www !clientcert
...
誰かがこれを手伝ってくれることを願っています...