使用 nginx 的 Keycloak 重定向 url 将转到 http 而不是 https
Posted
技术标签:
【中文标题】使用 nginx 的 Keycloak 重定向 url 将转到 http 而不是 https【英文标题】:Keycloak Redirect url with nginx is going to http rather than https 【发布时间】:2018-09-12 18:03:39 【问题描述】:Keycloak 正在使用带有 nginx 配置的反向代理,以便在 ssl(https) 中可用。 现在我已经在 ubuntu 中部署了 .net 核心应用程序。 此应用程序位于 http 中,并使用 keycloak 作为 openid 连接进行身份验证。
但是,当应用程序使用 nginx 在 https 中托管时,keycloak 会显示无效的重定向 url 而不是登录页面。 Keycloak 登录 url 页面包含带有 http 而不是 https 的 redirect_uri 参数。请帮忙解决 在 nginx 的配置文件中完成反向代理的配置
server
listen 443 ssl;
server_name abc.ctech.com;
ssl_certificate /etc/nginx/external/wildcard_ctech_com.pem;
ssl_certificate_key /etc/nginx/external/private.rsa;
location /
proxy_http_version 1.1;
proxy_set_header Host abc.ctech.com;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-Proto https;
proxy_set_header X-Forwarded-Port 443;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://172.30.5.28:8001;
#Keycloak Service
server
listen 443 ssl;
server_name keycloak.ctech.com;
ssl_certificate /etc/nginx/external/wildcard_ctech_com.pem;
ssl_certificate_key /etc/nginx/external/private.rsa;
location = /
return 301 https://keycloak.ctech.com/auth;
location /auth
proxy_pass http://172.30.5.28:8080/auth;
proxy_http_version 1.1;
proxy_set_header Host keycloak.ctech.com;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-Proto https;
proxy_set_header X-Forwarded-Port 443;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
【问题讨论】:
【参考方案1】:我已经在 docker swarm 模式下与集群 keycloak 斗争了很长时间。 Ubunter's answer 与文档中的相同,但这样做仍然没有为我解决问题。
要使其与当前的jboss/keycloak:latest
docker 映像 (:9.0.3
) 一起工作,我必须使用环境变量 KEYCLOAK_FRONTEND_URL。
在添加之前,它仍然不断向主/auth/js/keycloak.js?version=czy98
javascript 发出http URL:
...
<!-- Libraries not managed by yarn -->
<script src="/auth/resources/czy98/admin/keycloak/lib/angular/ui-bootstrap-tpls-0.11.0.js"></script>
<script src="/auth/resources/czy98/admin/keycloak/lib/angular/treeview/angular.treeview.js"></script>
<script src="/auth/resources/czy98/admin/keycloak/lib/fileupload/angular-file-upload.min.js"></script>
<script src="/auth/resources/czy98/admin/keycloak/lib/filesaver/FileSaver.js"></script>
<script src="/auth/resources/czy98/admin/keycloak/lib/ui-ace/min/ace.js"></script>
<script src="/auth/resources/czy98/admin/keycloak/lib/ui-ace/ui-ace.min.js"></script>
<script src="http://my.server.name.here/auth/js/keycloak.js?version=czy98" type="text/javascript"
></script>
<script src="/auth/resources/czy98/admin/keycloak/js/app.js" type="text/javascript"></script>
<script src="/auth/resources/czy98/admin/keycloak/js/controllers/realm.js" type="text/javascript"></scr
ipt>
<script src="/auth/resources/czy98/admin/keycloak/js/controllers/clients.js" type="text/javascript"></s
cript>
<script src="/auth/resources/czy98/admin/keycloak/js/controllers/users.js" type="text/javascript"></scr
ipt>
<script src="/auth/resources/czy98/admin/keycloak/js/controllers/groups.js" type="text/javascript"></sc
ript>
<script src="/auth/resources/czy98/admin/keycloak/js/controllers/roles.js" type="text/javascript"></scr
ipt>
<script src="/auth/resources/czy98/admin/keycloak/js/loaders.js" type="text/javascript"></script>
<script src="/auth/resources/czy98/admin/keycloak/js/services.js" type="text/javascript"></script>
...
它还在内联javascript中生成http:
<script type="text/javascript">
var authServerUrl = 'http://my.server.name.here/auth';
var authUrl = 'http://my.server.name.here/auth';
var consoleBaseUrl = '/auth/admin/master/console/';
var resourceUrl = '/auth/resources/czy98/admin/keycloak';
var masterRealm = 'master';
var resourceVersion = 'czy98';
</script>
尽管X-Forwarded-Proto: https
和standalone-ha.xml
中的其他必需内容
【讨论】:
谢谢,它解决了我在访问领域管理控制台时遇到的问题,尽管仍然 100% 不正确,所以如果请求 没有最后一个斜杠 / 它仍然返回错误的方案/端口 @987654329 @8000 是 nginx 监听来自 Network LB 的请求的端口。【参考方案2】:您需要代理传递给https://keycloak_address:8443/auth;。确保您打开了该端口。下面的代码对我有用。
server
listen 80;
server_name example.com;
server_tokens off;
location /.well-known/acme-challenge/
root /var/www/certbot;
location /
return 301 https://$server_name$request_uri;
server
listen 443 ssl;
server_name example.com;
server_tokens off;
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
include /etc/letsencrypt/options-ssl-nginx.conf;
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;
location /auth
proxy_pass https://keycloak_address:8443/auth;
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
【讨论】:
【参考方案3】:我认为问题在于 KEYCLOAK 文件配置。您应该在 http_listener 中添加以下参数:
<http-listener name="default" socket-binding="http" redirect-socket="proxy-https" proxy-address-forwarding="true" enable-http2="true"/>
并添加 socket-binding-group :
<socket-binding name="proxy-https" port="443"/>
【讨论】:
【参考方案4】:我相信您还必须添加一个侦听端口 80 (http) 的服务器块,该块将永久 (301) 重定向到同一服务器的端口 443 (https) 版本。..
类似于以下内容...(这两个地方都适用)
server
listen 80;
server_name example.com;
return 301 https://$server_name$request_uri;
因此,您需要在这两个地方添加一个永久重定向,将(当然)example.com 替换为您的实际服务器名称。
请告诉我们,谢谢。
【讨论】:
【参考方案5】:对于那些使用jwilder/nginx-proxy的人,可以让反向代理处理https并添加
- PROXY_ADDRESS_FORWARDING=true
- VIRTUAL_HOST= /**domain or subdomain**/
- VIRTUAL_PORT=8080
到您的 keycloak 环境参数
【讨论】:
以上是关于使用 nginx 的 Keycloak 重定向 url 将转到 http 而不是 https的主要内容,如果未能解决你的问题,请参考以下文章
docker 中 nginx 后面的 Keycloak 导致 404 和不定式重定向
如何在使用 keycloak 进行身份验证时处理 uri 重定向