基于 sni 的 Haproxy TLS 终止和直通
Haproxy TLS terminating and passthrough based on sni
我有类似的请求路径:
client mydomain.com -> nlb:443 -> haproxy -> cloudfront
client a.mydomain.com -> nlb:443 -> haproxy -> target_group_a
主要思想是对主域名进行 tls 直通,并将其发送到 cloudfront 而无需 TLS 终止。进入 a.mydomain.com
的请求应该传递给 target_group_a
和 它应该终止 tls。所以我的配置是:
frontend main
bind *:443
mode tcp
option tcplog
log global
tcp-request inspect-delay 5s
acl is_main req_ssl_sni -i "${pDomainName}"
acl is_a req_ssl_sni -m beg "a"
tcp-request content accept if { req_ssl_hello_type 1 }
use_backend main if is_main
use_backend a if is_a
backend main
mode tcp
option ssl-hello-chk
server cloudfront "${pCloudFrontUrl}:443" check resolvers aws
backend a
mode tcp
server local 127.0.0.1:9666 send-proxy
frontend a
bind *:9666 ssl crt server.pem ca-file ca.pem verify required accept-proxy
mode http
default_backend proxy_a
backend proxy_a
mode http
server elb "${pServer}:80" check resolvers aws
主记录成功通过,我得到 CloudFront SSL 终止,一切正常,但 a.mydomain.com
。
我也试图查看 SNI Haproxy 捕获了什么,但我在日志中只得到 capture0: -
。我确实喜欢(在 tcp 检查线之后)
tcp-request content capture req_ssl_sni len 15
log-format "capture0: %[capture.req.hdr(0)]"
这很奇怪,因为路由有效。
我已经尝试了很多可能性.. 现在我得到 SSL peer handshake failed, the server most likely requires a client certificate to connect
错误,但是 如果我在另一个端口上监听前端 a
在 http
模式下一切正常。
也许我错过了一些基本的东西,但我坚持了很长时间,也许有人可以帮助我。
对于正在或将要遭受这种情况的人,请确保您正在使用 gnu 版本的 curl 进行测试(或使用适当的库构建它),因为它不适用于 BSD curl。我的卷曲版本和库
curl 7.66.0 (x86_64-apple-darwin17.7.0) libcurl/7.66.0 SecureTransport zlib/1.2.11
Release-Date: 2019-09-11
Protocols: dict file ftp ftps gopher http https imap imaps ldap ldaps pop3 pop3s rtsp smb smbs smtp smtps telnet tftp
Features: AsynchDNS IPv6 Largefile libz NTLM NTLM_WB SSL UnixSockets
我有类似的请求路径:
client mydomain.com -> nlb:443 -> haproxy -> cloudfront
client a.mydomain.com -> nlb:443 -> haproxy -> target_group_a
主要思想是对主域名进行 tls 直通,并将其发送到 cloudfront 而无需 TLS 终止。进入 a.mydomain.com
的请求应该传递给 target_group_a
和 它应该终止 tls。所以我的配置是:
frontend main
bind *:443
mode tcp
option tcplog
log global
tcp-request inspect-delay 5s
acl is_main req_ssl_sni -i "${pDomainName}"
acl is_a req_ssl_sni -m beg "a"
tcp-request content accept if { req_ssl_hello_type 1 }
use_backend main if is_main
use_backend a if is_a
backend main
mode tcp
option ssl-hello-chk
server cloudfront "${pCloudFrontUrl}:443" check resolvers aws
backend a
mode tcp
server local 127.0.0.1:9666 send-proxy
frontend a
bind *:9666 ssl crt server.pem ca-file ca.pem verify required accept-proxy
mode http
default_backend proxy_a
backend proxy_a
mode http
server elb "${pServer}:80" check resolvers aws
主记录成功通过,我得到 CloudFront SSL 终止,一切正常,但 a.mydomain.com
。
我也试图查看 SNI Haproxy 捕获了什么,但我在日志中只得到 capture0: -
。我确实喜欢(在 tcp 检查线之后)
tcp-request content capture req_ssl_sni len 15
log-format "capture0: %[capture.req.hdr(0)]"
这很奇怪,因为路由有效。
我已经尝试了很多可能性.. 现在我得到 SSL peer handshake failed, the server most likely requires a client certificate to connect
错误,但是 如果我在另一个端口上监听前端 a
在 http
模式下一切正常。
也许我错过了一些基本的东西,但我坚持了很长时间,也许有人可以帮助我。
对于正在或将要遭受这种情况的人,请确保您正在使用 gnu 版本的 curl 进行测试(或使用适当的库构建它),因为它不适用于 BSD curl。我的卷曲版本和库
curl 7.66.0 (x86_64-apple-darwin17.7.0) libcurl/7.66.0 SecureTransport zlib/1.2.11
Release-Date: 2019-09-11
Protocols: dict file ftp ftps gopher http https imap imaps ldap ldaps pop3 pop3s rtsp smb smbs smtp smtps telnet tftp
Features: AsynchDNS IPv6 Largefile libz NTLM NTLM_WB SSL UnixSockets