无法对位于 HAProxy 服务器后面的 NiFi/NiFi Registry 实例进行身份验证

问题描述

我有一个位于 HAProxy 服务器后面的 NiFi 和 NiFi Registry 实例。 NiFi 实例均使用 SSL 进行保护。我无法将 SSL 信息从代理服务器传递到 NiFi 服务器。我也尝试过 SSL Passthrough,但还有其他一些限制。

我当前的 HAProxy 配置如下所示:

frontend https_in
    bind *:443 ssl crt /etc/ssl/nifi/nifi-server.pem verify required ca-file /etc/ssl/nifi/nifi-ca.cert
    mode http
    option httplog
    option http-server-close

    acl is_registry path_beg /nifi-registry

    use_backend nifi-registry if is_registry
    default_backend nifi

backend nifi-registry
   mode http
   balance roundrobin
   http-request set-header X-Forwarded-Port %[dst_port]
   http-request set-header X-Forwarded-Proto https if { ssl_fc }
   http-request set-header X-ProxyScheme https
   http-request set-header X-ProxyHost xx.xxx.xxx.xx
   http-request set-header X-ProxyPort 443

   server registry01 172.xx.xx.xxx:18443 check ssl verify none

当我浏览到 https://xx.xxx.xxx.xx:443/nifi-registry 并选择客户端证书时,我获得了 NiFi 注册表 UI,但没有使用我的客户端用户登录。我无法将我的 SSL 信息传递给 NiFi 服务器。在 documentation 之后,我设置了一些标题,但它们似乎没有效果

在这里遗漏了什么吗?

编辑

因此,正如评论中所建议和上面提到的,我还在 tlc 模式下尝试了 SSL Passthrough。有了这个,我设法将 SSL 身份验证传递给 NiFi 服务器,但我遇到了“无效主机标头”消息的麻烦。

我的 HAProxy 配置:

frontend http_in
    bind *:80 v4v6
    mode http
    redirect scheme https if !{ ssl_fc }

frontend nifi_registry_in
    bind *:1443 v4v6
    mode tcp
    option tcplog

    tcp-request inspect-delay 5s
    tcp-request content accept if { req_ssl_hello_type 1 }

    default_backend nifi_registry

frontend nifi_in
    bind *:2443 v4v6
    mode tcp
    option tcplog

    tcp-request inspect-delay 5s
    tcp-request content accept if { req_ssl_hello_type 1 }

    default_backend nifi

backend nifi_registry
   mode tcp
   balance roundrobin
   server registry01 xxx.xx.xx.xxx:18443 check

backend nifi
    mode tcp
    balance roundrobin
    server nifi01 xxx.xx.xx.xxx:9443 check

当浏览到 [public-haproxy-server-domain]:1443 时,我在身份验证后获得了注册表 ui。 浏览到 [public-haproxy-server-domain]:2443 时,我在身份验证后收到以下错误

我的 NiFi 配置是

nifi.web.https.host=xxx.xx.xx.xxx
nifi.web.https.port=9443
nifi.web.https.network.interface.default=
nifi.web.jetty.working.directory=./work/jetty
nifi.web.jetty.threads=200
nifi.web.max.header.size=16 KB
nifi.web.proxy.context.path=
nifi.web.proxy.host=[public-haproxy-server-domain]:2443

enter image description here

解决方法

所以我已经想通了,我觉得这很愚蠢。另一方面,我没有发现这有据可查。所以我会在这里发布我的答案给其他有需要的人。

显然要使 nifi.web.proxy.host 设置起作用,还应设置 nifi.web.proxy.context.path 设置。简单地将一个“/”作为这个值,一切都按预期工作。

nifi.web.proxy.context.path=/
nifi.web.proxy.host=[public-haproxy-server-domain]:2443

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...