使用 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: httpsstandalone-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 无限重定向

如何在使用 keycloak 进行身份验证时处理 uri 重定向

Dokku keycloak 重定向过多

在 keycloak 中,如何使用 kc_idp_hint 重定向到 IDP?

根据角色将不同的用户重定向到 Keycloak 登录的不同页面