Jose4j: Невозможно найти подходящий ключ проверки для JWS с заголовком

Проверка не удалась, потому что key_ops не соответствует критериям SimpleJwkFilter создан из статического метода filterForInboundSigned(JsonWebSignature jws) в SelectorSupport, Открытый ключ выглядит примерно так:

{
  "kid": "xxx",
  "use": "sig",
  "key_ops": [
    "sign"
  ],
  "kty": "xxx",
  "e": "xxx",
  "n": "xxx"
}

Согласно SimpleJwkFilter "key_ops" должен быть нулевым или содержать значение "verify", чтобы соответствовать критериям.

Есть ли способ настроить это поведение в jose4j? Может быть, пропустить проверку "key_ops"?

1 ответ

Решение

Если вы используете HttpsJwksVerificationKeyResolverВы могли бы иметь простой маленький подкласс HttpsJwks который сбрасывает "key_ops" на каждом JWK до того, как их увидит фильтр. Это будет выглядеть примерно так:

class MyHttpsJwks extends HttpsJwks
{
    public MyHttpsJwks(String location)
    {
        super(location);
    }

    @Override
    public List<JsonWebKey> getJsonWebKeys() throws JoseException, IOException
    {
        List<JsonWebKey> jsonWebKeys = super.getJsonWebKeys();
        for (JsonWebKey jwk : jsonWebKeys)
        {
            jwk.setKeyOps(null);
        }
        return jsonWebKeys;
    }
}

А затем создать экземпляр решателя как new HttpsJwksVerificationKeyResolver(new MyHttpsJwks("https://bad.example.com/jwks"));

Если вы используете JwksVerificationKeyResolverВы можете просто сделать то же самое с списком JsonWebKey, прежде чем создавать с его помощью преобразователь. Аналогичная предварительная обработка в списке также будет работать, если вы используете VerificationJwkSelector или SimpleJwkFilter напрямую.

FWIW, согласно RFC7517, параметры "use" и "key_ops" не должны использоваться вместе, и если они есть, они должны передавать одно и то же значение. Я бы сказал, что рассматриваемый JWK не соблюдает этого, потому что "key_ops" из "sign" говорит, что ключ может использоваться для вычисления цифровой подписи, в то время как "use" из "sig" говорит, что ключ может использоваться для операции с цифровой подписью в целом (подписать или проверить).

Другие вопросы по тегам