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