Jose4j:无法为 JWS 找到合适的验证密钥 header

Jose4j: Unable to find a suitable verification key for JWS w/ header

验证失败,因为 key_ops 不符合 SelectorSupport 中静态方法 filterForInboundSigned(JsonWebSignature jws) 创建的 SimpleJwkFilter 的条件。 public 键看起来像这样:

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

根据 SimpleJwkFilter "key_ops" 必须为空或包含值 "verify" 才能匹配条件。

有没有办法在 jose4j 中自定义此行为?也许跳过 "key_ops"?

的验证

如果您正在使用 HttpsJwksVerificationKeyResolver,您可以拥有 HttpsJwks 的简单小子类,它会在过滤器看到每个 JWK 之前取消设置 "key_ops"。看起来像这样:

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 不尊重这一点,因为 "sign" 的 "key_ops" 表示密钥可用于计算数字签名,而 "sig" 的 "use"表示该密钥一般可用于数字签名操作(签名或验证)。