在反向代理后面使用 Keycloak:无法打开管理员登录页面,因为内容混合

Posted

技术标签:

【中文标题】在反向代理后面使用 Keycloak:无法打开管理员登录页面,因为内容混合【英文标题】:Using Keycloak behind a reverse proxy: Could not open Admin loginpage because mixed Content 【发布时间】:2018-04-21 06:21:35 【问题描述】:

所以我在让 keycloak 3.2.1 在 kong (0.10.3) 后面工作时遇到了问题,kong (0.10.3) 是一个基于 nginx 的反向代理。

场景是:

我通过我的网关路由通过https://gateway/auth 调用keycloak,它向我显示了带有keycloak 徽标的入口点,链接到管理控制台等 - 到目前为止一切都很好。

但是当点击管理控制台 -> 调用 https://gateway/auth/admin/master/console/ 时,keycloak 会尝试通过 http 加载它的 css/js(见下面的屏幕截图),我的浏览器会因为混合内容而阻止它。

我四处搜索,发现这个线程:keycloak apache server configuration with 'Mixed Content' problems 导致这个 github 回购:https://github.com/dukecon/keycloak_postgres_https

从那时起,我尝试将其 cli 成功集成到我的 dockerfile 中(没有更改文件的内容,只是将它们复制到我的 repo 中并从 dockerfile 添加/运行它们)。这是我现在的 dockerfile:

FROM jboss/keycloak-postgres:3.2.1.Final

USER root

ADD config.sh /tmp/
ADD batch.cli /tmp/

RUN bash /tmp/config.sh

#Give correct permissions when used in an OpenShift environment.
RUN chown -R jboss:0 $JBOSS_HOME/standalone && \
    chmod -R g+rw $JBOSS_HOME/standalone

USER jboss
EXPOSE 8080

遗憾的是,我的问题仍然存在:

所以我现在没有想法,希望你能帮助我:

如何告诉 keycloak 在此处通过 https 调用其 css 文件?

我是否必须更改 cli 脚本中的某些内容?

这是脚本的内容:

config.sh:

#!/bin/bash -x

set -e

JBOSS_HOME=/opt/jboss/keycloak
JBOSS_CLI=$JBOSS_HOME/bin/jboss-cli.sh
JBOSS_MODE=$1:-"standalone"
JBOSS_CONFIG=$2:-"$JBOSS_MODE.xml"

echo "==> Executing..."
cd /tmp

$JBOSS_CLI --file=`dirname "$0"`/batch.cli

# cf. http://***.com/questions/34494022/permissions-error-when-using-cli-in-jboss-wildfly-and-docker
/bin/rm -rf $JBOSS_HOME/$JBOSS_MODE/configuration/$JBOSS_MODE_xml_history/current

和batch.cli:

embed-server --std-out=echo

# http://keycloak.github.io/docs/userguide/keycloak-server/html/server-installation.html
# 3.2.7.2. Enable SSL on a Reverse Proxy
# First add proxy-address-forwarding and redirect-socket to the http-listener element.
# Then add a new socket-binding element to the socket-binding-group element.

batch

/subsystem=undertow/server=default-server/http-listener=default:write-attribute(name=proxy-address-forwarding,value=true)

/subsystem=undertow/server=default-server/http-listener=default:write-attribute(name=redirect-socket,value=proxy-https)

/socket-binding-group=standard-sockets/socket-binding=proxy-https:add(port=443)

run-batch

stop-embedded-server

可能也很有趣,kong 部署在 openshift 上,路由使用从 http 到 https 的重定向(“insecureEdgeTerminationPolicy”:“Redirect”)。

【问题讨论】:

您解决了这个问题吗?有没有我可以看的工作示例? 【参考方案1】:

这听起来有点像Keycloak Docker behind loadbalancer with https fails的复制品

nginx中设置请求头X-Forwarded-ForX-Forwarded-Proto。然后,您必须配置 Keycloak(Wildfly、Undertow)以与 SSL 终止反向代理(又名负载平衡器)一起工作。详细说明见http://www.keycloak.org/docs/latest/server_installation/index.html#_setting-up-a-load-balancer-or-proxy。

关键是 nginx 正在终止 SSL 并将请求作为纯 http 转发到 Keycloak。因此 Keycloak/Wildfly 必须被告知来自 nginx 的传入 http 请求必须像处理 https 一样处理。

【讨论】:

我会检查 kong/nginx 并在确定时接受答案(不是我的工作台 atm,因此需要一些时间)。到目前为止谢谢! 对于任何陷入相同情况的人,我也会在这里提示:除了 Boomer 描述的事情(实际上,kong 默认发送正确的标头),我们的 openshift 有问题服务,通过8080调用。kc中8080​​的标准端口绑定是http,所以kc服务的是http。我们将 openshift 配置更改为使用 8443,等等。工作。 :) 有点不相关的问题,Keycloak 如何解析其基本 url?我们有一个带有公共和私有 IP 地址的 Keycloak 实例,并且 JWT 承载令牌(即领域 url)的 iss 字段相应地发生变化,即,如果我们从公共地址点击 auth 端点,iss 字段是 @ 987654328@ 和来自私有 IP 地址的 private-ip/realms/master。这是一些 HTTP 魔术还是 Kycloak 配置?文档提到设置反向代理,但我想这是另一种情况。 对于在尝试了文档中的所有内容以及 *** 上的所有解决方案后到达这里但仍然遇到混合内容问题的新手:设置 KEYCLOAK_FRONTEND_URL 环境变量最终为我解决了问题【参考方案2】:

在所有上游负载平衡器中添加 X-Forwarded-ForX-Forwarded-Proto 标头(如 Boomer 所说),并确保它们到达 Keycloak 服务器。 X-Forwarded-For 应该是路由到 LB 的 Keycloak 的域,X-Forwarded-Proto 应该是协议(大多数情况下是 https)。

作为最后一步,您需要修改standalone.xmlstandalone-ha.xml 文件并将proxy-address-forwarding="true" 属性添加到<http-listener> 下的<http-listener> 元素<server>

如果您使用的是 Docker,则可以使用原始 Keycloak 容器中的 PROXY_ADDRESS_FORWARDING 环境变量来设置此属性。

【讨论】:

对此***.com/questions/48513451/…有任何想法吗?【参考方案3】:

详细说明@MattBianco 的回复。在现代 Keycloak 变量中,您需要将 KEYCLOAK_FRONTEND_URL 设置为 https:///auth。使用 docker,您可以将其设置为环境变量,例如KEYCLOAK_FRONTEND_URL=https://auth.foo.com/auth

【讨论】:

取决于图像定义.. bitnami 例如有另一个图像:github.com/bitnami/bitnami-docker-keycloak【参考方案4】:

我和你有同样的问题,现在解决了,这是我的方法。

首先,我在干净的环境中使用 cloak 设置反向代理,确认代理和 cloak 配置正确。

接下来,通过测试和猜测,我发现在设置 keycloak 时使用您从 dockerhub 提取的图像和 docker。用服务器上的二进制设置有一些区别,从standalone.xml,你会发现关键点是这2:

1.您应该为 docker env 设置 PROXY_ADDRESS_FORWARDING=true。

2。您应该为 docker env 设置 jboss.https.port 443。

如果你的standalone.xml 也配置正确,你会得到它在管理页面上的工作。 祝你好运;)

【讨论】:

docker-compose 中设置这两个环境变量为我解决了这个问题。无需编辑standalone.xml 文件。 对于新手(2020 年)在尝试了文档中的所有内容以及 *** 上的所有解决方案后到达这里,但仍然遇到混合内容问题:设置 KEYCLOAK_FRONTEND_URL 环境变量最终为我修复了它 谢谢@MattBianco!你拯救了我的白天/黑夜。实际上,它不仅有效,而且您还完美地描述了整个场景。【参考方案5】:

如果您使用的是 Keycloak.X(Quarkus 版本的 Keycloak),那么这些解决方案将不起作用。

您必须设置环境变量KC_PROXY=edge(根据https://github.com/keycloak/keycloak-community/blob/master/design/keycloak.x/configuration.md)。

【讨论】:

【参考方案6】:

两个提示:

如果您使用docker-compose.yml,请将以下环境变量添加到 keycloak 容器中:

environment:
  PROXY_ADDRESS_FORWARDING: "true"

重启栈,检查变量是否存在(有时需要重启几次容器)

docker-compose exec keycloak bash -c 'echo $PROXY_ADDRESS_FORWARDING'

如果您使用 Apache 容器作为代理(使用 mod_proxy),您应该手动添加 X-Forwarded-Proto 和 X-Forwarded-Port 标头:

<IfModule mod_ssl.c>

# Proxy pass for keycloak
<VirtualHost *:443>
    ServerName auth.myproject_url.tld
    SSLEngine on
    SSLCertificateFile /etc/ssl/certs/apache-selfsigned.crt
    SSLCertificateKeyFile /etc/ssl/certs/apache-selfsigned.key
    <IfModule mod_proxy.c>
        SSLProxyEngine on
        <Location "/">
            ProxyPass  "http://keycloak:8080/"
            ProxyPassReverse "http://keycloak:8080/"
            RequestHeader set X-Forwarded-Proto "https"
            RequestHeader set X-Forwarded-Port "443"
            #  ProxyPreserveHost On
        </Location>
    </IfModule>
    </IfModule>
</VirtualHost>

【讨论】:

以上是关于在反向代理后面使用 Keycloak:无法打开管理员登录页面,因为内容混合的主要内容,如果未能解决你的问题,请参考以下文章

使用反向代理后面的 keycloak 进行身份验证失败

keycloak 无效参数:redirect_uri 在反向代理后面

如何使用反向代理修复 Keycloak 中的“我们很抱歉需要 HTTPS”?

Apache反向代理背后的Keycloak

反向代理背后的密钥斗篷

为啥带有 Netflix Zuul 反向代理的 Keycloak OAUTH2 不传递令牌