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

Dom*_*nik 14 ssl https openshift keycloak kong

所以我有一个问题,让keycloak 3.2.1在kong(0.10.3)后面工作,这是一个基于nginx的反向代理.

场景是:

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

但是当点击管理控制台 - >调用时https://{gateway}/auth/admin/master/console/,keycloak尝试通过http加载其css/js(参见下面的screenie),我的浏览器因为混合内容而阻止了.

我四处搜索并找到了这个帖子:keycloak apache服务器配置带有'混合内容'问题导致这个github repo: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
Run Code Online (Sandbox Code Playgroud)

可悲的是,我的问题仍然存在: 错误

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

  • 如何告诉keycloak在这里通过https调用'css-files?

  • 我是否需要更改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://stackoverflow.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
Run Code Online (Sandbox Code Playgroud)

和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
Run Code Online (Sandbox Code Playgroud)

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

Boo*_*mer 17

这听起来好像是在负载均衡器后面Keycloak Docker的副本,https失败了

设置请求头X-Forwarded-For,并X-Forwarded-Protonginx的.然后,您必须配置Keycloak(Wildfly,Undertow)以与SSL终止反向代理(也称为负载均衡器)一起使用.有关详细说明,请参见http://www.keycloak.org/docs/latest/server_installation/index.html#_setting-up-a-load-balancer-or-proxy.

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

  • 对于在尝试了文档中的所有内容和 stackoverflow 上的所有解决方案后到达这里但仍然遇到混合内容问题的新手:设置 [KEYCLOAK_FRONTEND_URL](/sf/answers/4305146401/) 环境变量最终得到修复对我来说 (3认同)
  • 有点不相关的问题,Keycloak 如何解析其基本 url?我们有一个带有公共和私有 IP 地址的 Keycloak 实例,并且 JWT 不记名令牌(即领域 url)的“iss”字段会相应更改,即如果我们从公共地址点击 auth 端点,则“iss”字段是“ public-ip/realms/master` 和来自私有 ip 地址的它是 `private-ip/realms/master`。这是一些 HTTP 魔法还是 Kycloak 配置?文档提到设置反向代理,但我认为这是一个不同的情况。 (2认同)

小智 13

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

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

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


bru*_*osg 11

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

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


jwa*_*nga 8

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


HuB*_*oQi 5

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

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

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

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

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

如果您的 standalone.xml 也配置正确,您将使其适用于管理页面。祝你好运;)

  • 对于新来者(2020)在尝试了文档中的所有内容和 stackoverflow 上的所有解决方案后到达这里,但仍然遇到混合内容问题:设置 [KEYCLOAK_FRONTEND_URL](/sf/answers/4305146401/) 环境变量为最终为我解决了这个问题 (7认同)

归档时间:

查看次数:

20314 次

最近记录:

6 年,5 月 前