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 输入 ~ http 输入/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 时,您必须使用ssl_fc_sni(从 OpenSSL API 获取 SNI)。

通过 TCP 模式传递时,您必须使用req_ssl_sni(解析 TCP 数据包中的 SNI)。

来自文档:

ssl_fc_sni :字符串

这将从通过 SSL/TLS 传输层建立的传入连接中提取服务器名称指示 TLS 扩展 (SNI) 字段,并由 haproxy 在本地解密。结果(如果存在)通常是与 HTTPS 主机名匹配的字符串(253 个字符或更少)。SSL 库必须已构建并启用对 TLS 扩展的支持(检查 haproxy -vv)。

此获取与上面的“req_ssl_sni”不同,因为它适用于 haproxy 解密的连接,而不是盲目转发的 SSL 内容。另请参阅下面的“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

相关内容