如果您因为创建了新领域而收到此错误
您可以直接更改 URL 栏中的 URL 以克服此错误。在您被重定向到的 URL 中(您可能必须在 Chrome 开发工具中查看此 URL),将领域从 master 更改为您刚刚创建的领域,如果您没有使用 https,请确保redirect_uri 也在使用http。
如果您因为尝试在面向公众的域(而非本地主机)上设置 Keycloak 而收到此错误
第 1 步)
按照 this documentation 设置 MySql 数据库(链接已损坏。如果您找到一些适合您的好的替代文档,请随时更新此链接并删除此消息)。您可能还需要参考this documentation。
第 2 步)
运行命令update REALM set ssl_required = 'NONE' where id = 'master';
注意:
此时,从技术上讲,您应该可以登录,但 Keycloak 4.0 版使用 https 作为重定向 uri,即使我们刚刚关闭了 https 支持。在 Keycloak 修复此问题之前,我们可以使用反向代理解决此问题。无论如何,我们都希望使用反向代理来轻松创建 SSL/TLS 证书,而不必担心 Java 密钥库。
注意 2: 写完这些说明后,Keycloak 推出了自己的代理。然后他们停止支持它并建议改用oauth2 proxy。它缺少 Keycloak 代理的一些功能,并且该代理的非官方版本仍在维护here。我没有尝试使用这些代理中的任何一个,但此时,您可能不想再按照我的指示使用其中一个了。
第 3 步) 安装 Apache。我们将使用 Apache 作为反向代理(我尝试过 NGINX,但 NGINX 有一些限制)。请参阅 yum installing Apache (CentOs 7) 和 apt-get install Apache (Ubuntu 16),或查找特定发行版的说明。
第 4 步)运行 Apache
-
使用sudo systemctl start httpd(CentO)或sudo systemctl start apache2(Ubuntu)
-
使用sudo systemctl status httpd (CentOs) 或sudo systemctl status apache2
(Ubuntu) 检查 Apache 是否正在运行。如果您在绿色文本中看到 active (running) 字样,或者如果最后一个条目显示为 Started The Apache HTTP Server.,那么您很好。
步骤 5) 我们将与反向代理建立 SSL 连接,然后反向代理将通过 http 与 keyCloak 通信。因为这个 http 通信发生在同一台机器上,所以你仍然是安全的。我们可以使用Certbot来设置自动更新证书。
如果这种类型的加密不够好,并且您的安全策略需要端到端加密,您将不得不弄清楚如何setup SSL through WildFly,而不是使用反向代理。
注意:
我实际上从来没有能够让 https 与管理门户一起正常工作。也许这可能只是我正在使用的 Keycloak 4.0 测试版中的一个错误。您应该能够将 SSL 级别设置为仅对外部请求需要它,但这似乎不起作用,这就是我们在步骤 #2 中将 https 设置为 none 的原因。从这里开始,我们将继续通过 SSH 隧道使用 http 来管理管理设置。
第 6 步)
每当您尝试通过 https 访问该站点时,您将触发一个 HSTS 策略,该策略将自动强制 http 请求重定向到 https。按照这些说明到clear the HSTS rule from Chrome,然后暂时不要再访问https版本的网站了。
第 7 步)
配置阿帕奇。在下面的代码块中添加虚拟主机配置。如果您从未这样做过,那么您需要做的第一件事就是弄清楚在哪里添加此配置文件。
在 RHEL 和其他一些发行版上
你需要找到你的httpd.conf or apache2.conf file is located。该配置文件应该从另一个文件夹(例如conf.d)加载虚拟主机配置文件。
如果您使用的是 Ubuntu 或 Debian,
您的配置文件将位于/etc/apache2/sites-available/ 中,您需要通过运行命令sudo a2ensite name-of-your-conf-file.conf 来启用它们。这将在/etc/apache2/sites-enabled/ 中创建一个符号链接,这是 Apache 在 Ubuntu/Debian 上查找配置文件的地方(请记住,配置文件放置在可用的站点中,略有不同)。
所有发行版
找到配置文件后,在配置文件中更改或添加以下虚拟主机条目。确保您没有覆盖由 certbot 生成的已经存在的 SSL 选项。完成后,您的配置文件应如下所示。
<VirtualHost *:80>
RewriteEngine on
#change https redirect_uri parameters to http
RewriteCond %{request_uri}\?%{query_string} ^(.*)redirect_uri=https(.*)$
RewriteRule . %1redirect_uri=http%2 [NE,R=302]
#uncomment to force https
#does not currently work
#RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI}
#forward the requests on to keycloak
ProxyPreserveHost On
ProxyPass / http://127.0.0.1:8080/
ProxyPassReverse / http://127.0.0.1:8080/
</VirtualHost>
<IfModule mod_ssl.c>
<VirtualHost *:443>
RewriteEngine on
#Disable HSTS
Header set Strict-Transport-Security "max-age=0; includeSubDomains;" env=HTTPS
#change https redirect_uri parameters to http
RewriteCond %{request_uri}\?%{query_string} ^(.*)redirect_uri=https(.*)$
RewriteRule . %1redirect_uri=http%2 [NE,R=302]
#forward the requests on to keycloak
ProxyPreserveHost On
ProxyPass / http://127.0.0.1:8080/
ProxyPassReverse / http://127.0.0.1:8080/
#Leave the items added by certbot alone
#There should be a ServerName option
#And a bunch of options to configure the location of the SSL cert files
#Along with an option to include an additional config file
</VirtualHost>
</IfModule>
第 8 步) 重新启动 Apache。使用 sudo systemctl restart httpd (CentOs) 或 sudo systemctl restart apache2 (Ubuntu)。
第 9 步)
在您有机会尝试登录服务器之前,由于我们告诉 Keycloak 使用 http,我们需要设置另一种安全连接方法。这可以通过在 keycloak 服务器上安装 VPN 服务或使用 SOCKS 来完成。我使用了 SOCKS 代理。为此,您首先需要设置动态端口转发。
ssh -N -D 9905 user@example.com
或者通过Putty进行设置。
发送到端口 9905 的所有流量现在都将通过 SSH 隧道安全地路由到您的服务器。确保将服务器防火墙上的端口 9905 列入白名单。
完成动态端口转发设置后,您需要将浏览器设置为在端口 9905 上使用 SOCKS 代理。Instructions here。
第 10 步) 您现在应该可以登录 Keycloak 管理门户了。要连接到该网站,请转到http://127.0.0.1,SOCKS 代理会将您带到管理控制台。完成后请务必关闭 SOCKS 代理,因为它会占用您服务器的资源,如果继续打开,您的网速会变慢。
第 11 步)不要问我花了多长时间才弄清楚这一切。