Keycloak:缺少领域公钥

问题描述 投票:0回答:3

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

keycloak OIDC JSON 没有公钥

我希望 JSON 中有类似的内容:

 "realm-public-key": "MIIBIjANBg....
keycloak
3个回答
21
投票
最新的 keycloak 中的 keycloak.json 没有任何领域公钥。实际上,您似乎使用的是 keycloak 版本 2.3.x。其中发生了一些变化。基本上,您可以为一个领域轮换多个公钥。

文件说

在 2.3.0 版本中,我们添加了对公钥轮换的支持。当管理员在 Keycloak 管理控制台中轮换领域密钥时,客户端适配器将能够识别它并自动从 Keycloak 下载新的公钥。但是,如果您的适配器中没有带有硬编码公钥的领域公钥选项,则会自动下载新密钥。因此,我们不再建议在适配器配置中使用领域公钥选项。

请注意,此选项仍然受支持,但仅当您确实希望在适配器配置中使用硬编码公钥并且从不从 Keycloak 下载公钥时,它可能会很有用。从理论上讲,这样做的一个原因可能是,如果适配器和 Keycloak 之间的网络不受信任,则可以避免中间人攻击,但在这种情况下,使用 HTTPS 是更好的选择,这将保护之间的所有请求适配器和钥匙斗篷。


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

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


0
投票
我最初也遇到了同样的问题,但后来发现我使用了错误的 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 库验证 JWT 非常容易(

https://connect2id.com/products/nimbus-jose-jwt/examples/validating-jwt-access-tokens):

... 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); ...
    
© www.soinside.com 2019 - 2024. All rights reserved.