我正在Keycloak实例中配置一个外部身份提供程序,并尝试使用外部JWKS URL来使它验证令牌。使用从JWKS转换的PEM可以正常工作,使用URL无效。
登录后,令牌验证失败并显示以下消息:
[org.keycloak.broker.oidc.AbstractOAuth2IdentityProvider] (default task-4) Failed to make identity provider oauth callback: org.keycloak.broker.provider.IdentityBrokerException: token signature validation failed
我调试了Keycloak服务器,以获取更多有关该问题的信息,并在类JWKSUtils
中发现了一个“问题”:
/**
* @author <a href="mailto:mposolda@redhat.com">Marek Posolda</a>
*/
public class JWKSUtils {
//...
public static Map<String, KeyWrapper> getKeyWrappersForUse(JSONWebKeySet keySet, JWK.Use requestedUse) {
Map<String, KeyWrapper> result = new HashMap<>();
for (JWK jwk : keySet.getKeys()) {
JWKParser parser = JWKParser.create(jwk);
if (jwk.getPublicKeyUse().equals(requestedUse.asString()) && parser.isKeyTypeSupported(jwk.getKeyType())) {
KeyWrapper keyWrapper = new KeyWrapper();
keyWrapper.setKid(jwk.getKeyId());
keyWrapper.setAlgorithm(jwk.getAlgorithm());
keyWrapper.setType(jwk.getKeyType());
keyWrapper.setUse(getKeyUse(jwk.getPublicKeyUse()));
keyWrapper.setVerifyKey(parser.toPublicKey());
result.put(keyWrapper.getKid(), keyWrapper);
}
}
return result;
}
//...
}
if
以NullPointerException
失败,因为调用jwk.getPublicKeyUse()
返回了null
。
但是我发现它是null
,因为JWKS URL返回了一个没有属性 use 的键,该键根据规范是可选的。 [https://tools.ietf.org/html/rfc7517#section-4.2]
Keycloak仅接受JWKS URL,这些URL返回定义了 use 属性的所有密钥。但是我尝试连接的IdP不会在密钥中返回该属性。
鉴于这种情况,我应该向谁提出问题,IdP还是Keycloak?还是我在配置中做错了什么?
答案 0 :(得分:0)
我于2019年8月向Keycloak提交了一个issue,涉及这一确切问题。
他们的答案:
在没有验证alg的情况下使用密钥是很危险的 Keycloak要求这些必须存在。
就我而言,我联系了IdP,他们能够填充“ use”参数。如果那不是一种选择,那么您就完全无法解决问题了。