验证失败,因为key_ops不符合从SimpleJwkFilter
中的静态方法filterForInboundSigned(JsonWebSignature jws)
创建的SelectorSupport
的标准。公钥看起来像这样:
{
"kid": "xxx",
"use": "sig",
"key_ops": [
"sign"
],
"kty": "xxx",
"e": "xxx",
"n": "xxx"
}
根据SimpleJwkFilter
“ key_ops”必须为null或包含值“ verify”以匹配条件。
在jose4j中是否可以自定义此行为?也许跳过对“ key_ops”的验证?
答案 0 :(得分: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”的“使用”则表示可以将密钥用于一般进行数字签名操作(签名或验证)。