在反向代理后面使用 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-For
和X-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-For
和 X-Forwarded-Proto
标头(如 Boomer 所说),并确保它们到达 Keycloak 服务器。
X-Forwarded-For
应该是路由到 LB 的 Keycloak 的域,X-Forwarded-Proto
应该是协议(大多数情况下是 https)。
作为最后一步,您需要修改standalone.xml
或standalone-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 无效参数:redirect_uri 在反向代理后面