【发布时间】:2017-03-23 01:41:03
【问题描述】:
当我访问 keycloak 管理控制台 (!remotely) 并创建客户端时:
keycloak OIDC JSON 没有公钥
我希望在 JSON 中有类似的东西:
"realm-public-key": "MIIBIjANBg....
【问题讨论】:
标签: keycloak
当我访问 keycloak 管理控制台 (!remotely) 并创建客户端时:
keycloak OIDC JSON 没有公钥
我希望在 JSON 中有类似的东西:
"realm-public-key": "MIIBIjANBg....
【问题讨论】:
标签: keycloak
最新 keycloak 中的 keycloak.json 没有任何领域公钥......实际上,您使用的 keycloak 版本 2.3.x 似乎发生了一些变化。基本上你可以为一个领域轮换多个公钥。该文件是这样说的:-
在 2.3.0 版本中,我们添加了对公钥轮换的支持。当管理员 轮换 Keycloak 管理控制台中的领域密钥,客户端适配器 将能够识别它并自动下载新的公钥 来自钥匙斗篷。但是,完成了新密钥的自动下载 只是如果您的适配器中没有 realm-public-key 选项 硬编码的公钥。因此,我们不建议使用 适配器配置中的领域公钥选项不再。注意这个 选项仍然受支持,但如果你真的 希望在您的适配器配置中有硬编码的公钥,并且 永远不要从 Keycloak 下载公钥。理论上,一个原因 如果您不信任,这可以避免中间人攻击 适配器和 Keycloak 之间的网络,但是在这种情况下,它很多 使用 HTTPS 的更好选择,这将保护之间的所有请求 适配器和 Keycloak。
【讨论】:
<realm-url>/protocol/openid-connect/certs 上获取与 GET 一起使用的证书。
我最初也有同样的问题,但后来发现我使用了错误的 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);
...
【讨论】: