【发布时间】:2021-07-01 15:25:27
【问题描述】:
我有一个公共 ssl 端点 something.example.com,它需要使用 SNI 扩展。我不能直接访问它,所以我想通过 haproxy 传递它(它设置在可以访问互联网的服务器中)
这不起作用:
openssl s_client -connect something.example.com:443
这工作正常:
openssl s_client -connect something.example.com:443 -servername something.example.com
我的 haproxy 配置(版本 1.8.24):
frontend my_frontend
bind *:443
mode tcp
log global
option tcplog
tcp-request inspect-delay 5s
tcp-request content accept if { req_ssl_hello_type 1 }
use_backend my_backend
backend my_backend
mode tcp
server my-server something.example.com:443 sni str(something.example.com)
当我登录 haproxy 服务器时,我可以这样做:
curl -v https://something.example.com/ 可以看到 SSL 连接已经建立
但是在做curl -v https://127.0.0.1/我面对的时候:
curl: (35) OpenSSL SSL_connect: SSL_ERROR_SYSCALL 连接到 127.0.0.1:443
怎么了?我已经尝试终止 ssl,替换主机头但没有运气。我的理解是 SNI 本身与加密请求是分开的,通过上述配置,我应该能够连接到后端。
附言。后端服务器不是我管理的。
编辑:如 cmets 中所述,无法在 TCP 模式配置中传递自定义 SNI。可以为 http 模式执行以下操作,使用 TLS 终止,以下工作正常:
frontend log_frontend
bind *:443 ssl crt /etc/pki/tls/private/mycert.pem
mode http
log global
option httplog
option forwardfor
use_backend log_backend
backend log_backend
mode http
server my-server something.example.com:443 ssl verify none sni str(something.example.com)
【问题讨论】: