我们在负载均衡器F5后面部署了Keycloak。 OIDC客户端坐在公共网络中使用“https”进行所有通信。 SSL在F5中终止,数据包被转发到Keycloak(例如在端口8080上)。
OIDC客户端以这样的方式设计,以便使用它在/token
请求的响应中接收的端点(如.well-known/openid-configuration
等)。
这里的问题是.well-known
配置响应带有协议的URL作为http
用于所有端点,其中客户端期望使用https
协议。因为此客户端无法与这些URL建立安全连接。
问题是 - 我们如何通过协议.well-known/openid-configuration
获得https
请求返回的响应;像下面提到的那样
{
"issuer":"https://<domain>/auth/realms/master",
"authorization_endpoint":"https://<domain>/auth/realms/master/protocol/openid-connect/auth",
"token_endpoint":"https://<domain>/auth/realms/master/protocol/openid-connect/token"
.......
}
我们已经按照documentation中提到的步骤进行了操作。
即,在F5中添加了x-Forwarded-For
和x-Forwarded-Proto
,并按照文档中的说明进行了相应的keycloak配置更改。我可能缺少任何配置或设置吗?
从我收集的内容来看,它可以在领域层面上完成(我没有亲自使用过它)。虽然这是一个很长的过程解释,完全超出了这个答案的范围。相反,我给出了一个文档的链接。
https://www.keycloak.org/docs/3.3/server_installation/topics/network/https.html
我几天来一直在努力解决同样的问题并最终弄明白了。问题是Keycloak在代理后面运行时使用X-Forwarded-Proto
HTTP头来确定传入请求是否是通过HTTPS发出的。您的负载均衡器(在我的案例中为AWS ELB)需要正确设置此标头(请参阅similar issue)。
使用ELB时,您需要确保:
HTTPS
TCP
,接收后端支持Proxy Protocol在我的情况下,我的听众被设置为TCP
但后端没有相应配置。我发现NGINX和Kubernetes'NGINX Ingress Controller支持这个选项。