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" говорит, что ключ может использоваться для операции с цифровой подписью в целом (подписать или проверить).