0

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

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

根据SimpleJwkFilter“key_ops”要么必须为空,要么包含值“验证”以匹配标准。

有没有办法在 jose4j 中自定义这种行为?也许跳过“key_ops”的验证?

4

1 回答 1

1

如果您正在使用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”的“使用”表示密钥可用于一般的数字签名操作(签名或验证)。

于 2018-08-28T20:01:40.093 回答