Keycloak:缺少领域公钥

Posted

技术标签:

【中文标题】Keycloak:缺少领域公钥【英文标题】:Keycloak: missing realm public key 【发布时间】:2017-03-23 01:41:03 【问题描述】:

当我访问 keycloak 管理控制台 (!remotely) 并创建客户端时:

keycloak OIDC JSON 没有公钥

我希望在 JSON 中有类似的东西:

 "realm-public-key": "MIIBIjANBg....

【问题讨论】:

【参考方案1】:

我仍然不知道为什么keycloak OIDC JSON中没有公钥(可能出于安全原因),但我在以下位置找到了它:

领域设置 > 密钥 > 公钥视图

【讨论】:

我仍然不知道为什么 keycloak OIDC JSON 中没有公钥 这是因为密钥轮换。如果适配器直接从服务器 下载 密钥,则不是在 JSON 中硬编码密钥,而是更加灵活。这样你就可以旋转这些键;每个月都用新的替换它们。【参考方案2】:

最新 keycloak 中的 keycloak.json 没有任何领域公钥......实际上,您使用的 keycloak 版本 2.3.x 似乎发生了一些变化。基本上你可以为一个领域轮换多个公钥。该文件是这样说的:-

在 2.3.0 版本中,我们添加了对公钥轮换的支持。当管理员 轮换 Keycloak 管理控制台中的领域密钥,客户端适配器 将能够识别它并自动下载新的公钥 来自钥匙斗篷。但是,完成了新密钥的自动下载 只是如果您的适配器中没有 realm-public-key 选项 硬编码的公钥。因此,我们不建议使用 适配器配置中的领域公钥选项不再。注意这个 选项仍然受支持,但如果你真的 希望在您的适配器配置中有硬编码的公钥,并且 永远不要从 Keycloak 下载公钥。理论上,一个原因 如果您不信任,这可以避免中间人攻击 适配器和 Keycloak 之间的网络,但是在这种情况下,它很多 使用 HTTPS 的更好选择,这将保护之间的所有请求 适配器和 Keycloak。

【讨论】:

是否有文档可以获取正在使用的公钥? @ibotty 我还没有遇到任何此类直接文档,但您可以更改键的优先级。优先级最高的键被使用 只是给那些寻找一年前我的问题答案的人的说明:您可以在<realm-url>/protocol/openid-connect/certs 上获取与 GET 一起使用的证书。 SAML 怎么样? 你能看看我的 Keycloak 相关问题***.com/q/70376766/2886891 吗?谢谢。【参考方案3】:

我最初也有同样的问题,但后来发现我使用了错误的 URL。 OpenID 配置由 Keycloak 根据标准在此 URL 下发布:

http://localhost:8080/auth/realms/myrealm/.well-known/openid-configuration

但是公钥是在jwks_uri下发布的,就是这样的:

http://localhost:8080/auth/realms/myrealm/protocol/openid-connect/certs

使用第二个 URL,使用 connect2id 库 (https://connect2id.com/products/nimbus-jose-jwt/examples/validating-jwt-access-tokens) 验证 JWT 非常容易:

...
JWT idToken = JWTParser.parse(bearerAccessToken.toString());

Nonce expectedNonce = null;
Issuer iss = new Issuer("http://localhost:8080/auth/realms/myrealm");
JWSAlgorithm jwsAlg = JWSAlgorithm.RS256;
URL jwkSetURL = new URL("http://localhost:8080/auth/realms/myrealm/protocol/openid-connect/certs");

IDTokenValidator validator = new IDTokenValidator(iss, clientID, jwsAlg, jwkSetURL);
IDTokenClaimsSet claims = validator.validate(idToken, expectedNonce);
...
                

【讨论】:

以上是关于Keycloak:缺少领域公钥的主要内容,如果未能解决你的问题,请参考以下文章

Keycloak 缺少表单参数:grant_type

Swagger 中的 Keycloak 集成

如何使用公钥在本地验证 keycloak 访问令牌

nginx登录背后的keycloak失败,帖子中缺少端口号等

Keycloak - 用户信息响应中缺少数据

KeyCloak 与 Azure ADB2C 集成 - 缺少状态参数