3

我在我的 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失败并带有 a ,NullPointerException因为调用jwk.getPublicKeyUse()返回null

但我发现这是因为 JWKS URL 返回一个没有属性usenull的单个键,根据规范,这是可选的。[https://www.rfc-editor.org/rfc/rfc7517#section-4.2]

Keycloak 仅接受 JWKS URL,这些 URL 返回所有已定义属性使用的键。但是我尝试连接的 IdP 不会在密钥中返回该属性。

鉴于这种情况,我应该向谁提出问题,IdP 还是 Keycloak?还是我在配置中做错了什么?

4

1 回答 1

0

我在 2019 年 8 月向 Keycloak 提交了关于这个确切问题的问题

他们的回答:

在没有验证 alg 和 use 的情况下使用密钥是危险的,因为 Keycloak 要求这些密钥存在。

就我而言,我联系了 IdP,他们能够填充“使用”参数。如果这不是一个选项,那么您几乎无法解决您的解决方法。

于 2020-11-24T15:42:53.810 回答