HAproxy REQ_SSL_SNI と SSL 終了

HAproxy REQ_SSL_SNI と SSL 終了

haproxy を REQ_SSL_SNI と SSL 終了で動作させようとしています。

私が従ってきたガイドhttps://www.haproxy.com/blog/enhanced-ssl-load-balancing-with-server-name-indication-sni-tls-extension/ https://stuff-things.net/2016/11/30/haproxy-sni/

セットアップ: HA-Proxy バージョン 1.6.3 Ubuntu 16.04

ログは以下を生成します:

HTTP-in ~ http-in/NOSRV-1/-1/12 0 SC 0/0/0/0/0 0/0

frontend http-in
bind *:443 ssl crt /etc/haproxy/certs/
log global
reqadd X-Forwarded-Proto:\ https
mode tcp 
option tcplog
# wait up to 5 seconds from the time the tcp socket opens
# until the hello packet comes in (otherwise fallthru to the default)
tcp-request inspect-delay 5s
tcp-request content accept if { req.ssl_hello_type 1 }
acl is_site1 req_ssl_sni -i foo.foobar.com
acl is_site2 req_ssl_sni -i foobar.com
use_backend www-foo-foobar if is_site1
use_backend www-foobar if is_site2

backend www-foo-foobar
log global
mode tcp 
option tcplog
redirect scheme https if !{ ssl_fc }
server www-1 127.0.0.1:3030 check

backend www-foobar
log global
mode tcp 
option tcplog
redirect scheme https if !{ ssl_fc }
server www-1 127.0.0.1:5000 check

何が足りないのでしょうか?

誰か私に正しい方向を指し示してくれませんか?

答え1

以下をお試しくださいssl_fc_sni:

    acl is_site1 ssl_fc_sni foo.foobar.com
    acl is_site2 ssl_fc_sni foobar.com

ssl_fc_sni基本的に、SSL を終了/解読する場合は、 (OpenSSL API から SNI を取得)を使用する必要があります。

TCP モードで渡す場合は、 を使用する必要がありますreq_ssl_sni(TCP パケット内の SNI を解析します)。

ドキュメントより:

ssl_fc_sni : 文字列

これは、SSL/TLS トランスポート層を介して行われ、haproxy によってローカルに解読された着信接続から Server Name Indication TLS 拡張 (SNI) フィールドを抽出します。結果 (存在する場合) は通常、HTTPS ホスト名に一致する文字列 (253 文字以下) です。SSL ライブラリは、TLS 拡張のサポートを有効にしてビルドされている必要があります (haproxy -vv を確認してください)。

このフェッチは、haproxy によって解読される接続に適用され、盲目的に転送される SSL コンテンツには適用されないという点で、上記の「req_ssl_sni」とは異なります。以下の「ssl_fc_sni_end」および「ssl_fc_sni_reg」も参照してください。これには、SSL ライブラリが TLS 拡張機能のサポートを有効にしてビルドされている必要があります (haproxy -vv を確認してください)。

ACL誘導体:

  • ssl_fc_sni_end : サフィックス一致
  • ssl_fc_sni_reg : 正規表現の一致

https://cbonte.github.io/haproxy-dconv/2.0/configuration.html#7.3.4-ssl_fc_sni

関連情報