【问题标题】:SSL over HAProxy issueSSL over HAProxy 问题
【发布时间】:2013-12-28 12:32:26
【问题描述】:

我正在尝试在 HAProxy 负载平衡器后面放置一个 HTTPS Web 服务器。 HTTPS 服务器在端口 8000 上的 Node.js 上运行,拥有所有正确的 SSL 证书和密钥,如果我尝试通过 URL 直接访问它,它就可以工作,例如https://ssltest.mydomain.com:8000/。我还可以使用openssl s_client -connect ssltest.mydomain.com:8000 检查 SSL 连接,它显示的数据似乎正确。

此 HTTPS 服务器的前端是另一个子域,例如app.mydomain.com,它在默认的 SSL 端口 443 上运行。

但是当我尝试从浏览器访问 https://app.mydomain.com 时,我收到了 SSL 错误。上面的命令行检查也失败了:openssl s_client -connect app.mydomain.com:443 -state -debug

下面是我的 HA 代理配置的样子:

global
    log /dev/log local0 info
    log /dev/log local0 notice
    maxconn 20000
    user haproxy
    group haproxy
    daemon
    spread-checks 5

defaults
    log     global
    mode    tcp
    option  dontlognull
    retries 3
    option  redispatch
    timeout connect 30s
    timeout client  30s
    timeout server  30s
    timeout check 5s
    balance roundrobin

frontend https_proxy
    bind :443
    acl is_app  hdr_dom(host) -i app.mydomain.com
    acl is_rest hdr_dom(host) -i rest.mydomain.com
    acl is_io   hdr_dom(host) -i io.mydomain.com
    use_backend core_https    if is_app
    use_backend core_rest_api if is_rest
    use_backend core_www_io   if is_io

backend core_https
    server www1 10.0.0.174:8000 maxconn 25 check inter 5s rise 18 fall 2

backend core_www_io
    server io1 10.0.0.174:8100 maxconn 25 check inter 5s rise 18 fall 2

backend core_rest_api
    server api1 10.0.0.174:8200 maxconn 25 check inter 5s rise 18 fall 2

我不明白为什么这不能通过 HAProxy 工作,而是直接工作,我非常感谢你的建议。

【问题讨论】:

  • 我对 haproxy 了解不多,但在我看来,您想要访问 3 个不同的后端,具体取决于客户端在其 Host: http 标头中发送的主机。这不适用于 SSL,因为 HTTP 标头直到 SSL 协商之后才会发送到服务器,并且 SSL 协商已经知道目标主机名才能选择正确的证书。
  • 感谢您的回复,但在这种情况下,是否有 1,3 个或更多不同的主机并不重要。正如我所说,这对它们中的任何一个都不起作用,但是在直接连接到主机时起作用,没有 HAProxy

标签: ssl https haproxy


【解决方案1】:

您混淆了第 4 层和第 7 层负载平衡。要使用hdr_dom 分隔请求,您需要仅可用于 HTTP 的第 7 层,并且您可能猜到 HTTPS 在第 4 层上工作。

因此,由于 haproxy 无法检查主机,因此您的 ifs 都没有返回 true 并且没有选择后端,要解决此问题,您应该添加一个 default_backend 条目。

frontend https_proxy
    bind :443
    acl is_app  hdr_dom(host) -i app.mydomain.com
    acl is_rest hdr_dom(host) -i rest.mydomain.com
    acl is_io   hdr_dom(host) -i io.mydomain.com
    use_backend core_https    if is_app
    use_backend core_rest_api if is_rest
    use_backend core_www_io   if is_io
    default_backend core_https

【讨论】:

  • 嗨,谢谢,我在没有acl的情况下试过了,它可以工作。我想我必须通过端口而不是子域来区分,或者寻找更多的解决方案。
  • 您可以将 acl 与第 4 层检查一起使用,例如不同的端口。但我建议在 haproxy 之前或在 haproxy 上终止 SSL,您可以使用 haproxy 1.5 执行此操作,或者您可以在 haproxy 前面安装 F.E.、nginx。
猜你喜欢
  • 2011-11-30
  • 1970-01-01
  • 1970-01-01
  • 2011-06-07
  • 2014-04-10
  • 1970-01-01
  • 2020-03-05
  • 2013-09-03
  • 2018-11-23
相关资源
最近更新 更多