反向代理背后的密钥斗篷

Posted

技术标签:

【中文标题】反向代理背后的密钥斗篷【英文标题】:Keycloak behind reverse proxy 【发布时间】:2019-01-15 00:14:46 【问题描述】:

我在服务器上安装了独立的 keycloak,并尝试通过 nginx 在反向代理后面使用它。 Keycloak 绑定到 127.0.0.1

这是我的 nginx 虚拟主机配置:

server 
server_name auth.dp.net;
location /auth 
    proxy_pass  http://localhost:8080;
    proxy_http_version 1.1;

        proxy_set_header Host               $host;
        proxy_set_header X-Real-IP          $remote_addr;
        proxy_set_header X-Forwarded-For    $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto  $scheme;

listen 443 ssl; # managed by Certbot
ssl_certificate /etc/letsencrypt/live/auth.dp.net/fullchain.pem; # managed by Certbot
ssl_certificate_key /etc/letsencrypt/live/auth.dp.net/privkey.pem; # managed by Certbot
include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot


server 
if ($host = auth.dp.net) 
    return 301 https://$host$request_uri;
 # managed by Certbot
listen 80;
server_name auth.dp.net;
return 404; # managed by Certbot

但是当我访问 https://auth.dp.net/auth 时,我得到以下 keycloak 错误:

Invalid parameter: redirect_uri

我的配置中缺少什么?

【问题讨论】:

【参考方案1】:

一个或两个/,也许还有一个=

location /auth 
    proxy_pass  http://localhost:8080;

如果您的代理通行证指令是裸露的,即没有指定路径(如上所述),那么整个请求路径将附加到代理通行证 url。

因此,您上面的配置将导致对https://auth.dp.net/auth 的请求被代理到http://localhost:8080/auth/

如果您添加任何内容,即使只是在您的代理传递指令中添加一个斜线,那么您添加的任何内容都将替换您的位置指令的匹配部分。因此,要将请求传递给没有路径的代理,您需要添加一个斜杠。所以这可能有效:

location /auth 
    proxy_pass  http://localhost:8080/;

但是,由于 Nginx 喜欢在代理时添加尾部斜杠,如果请求 url 没有它可能不起作用。因此,您可以通过将 location 指令更改为来告诉 Nginx 完全匹配:

location = /auth 

或者您预计它将重写您的请求并将其更改为:

location /auth/ 

或者,如果您真的想成为专业人士,您可以创建两个相同的块。一个是= /auth,另一个是/auth/

这是因为:

如果您使用= /auth,则请求https://auth.dp.net/auth/ 将不匹配,因此不会被代理。 如果您使用/auth/,它将同时适用于https://auth.dp.net/authhttps://auth.dp.net/auth/,但前者会在Nginx 中触发内部重写以添加/,从而有效地将您的服务器负载加倍以处理身份验证请求。

【讨论】:

【参考方案2】:

转到您的 Keycloak 客户端的设置并将有效重定向 Uri 更改为 *。

有效的重定向 Uri 是 Keycloak 的一种安全机制,可限制重定向可能发生的位置。在生产中,它应该尽可能准确以确保安全连接。

【讨论】:

以上是关于反向代理背后的密钥斗篷的主要内容,如果未能解决你的问题,请参考以下文章

反向代理背后的 Csrfguard

Apache反向代理背后的Keycloak

公共反向代理背后的 WCF Webservice

Nginx 反向代理背后的 Grafana 返回 alert.title

Apache 反向代理背后的 Apache Zeppelin

反向代理背后的 SOP 问题