Jose4j:无法为带有标题的JWS找到合适的验证密钥

时间:2018-08-17 15:49:40

标签: jose4j

验证失败,因为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”的验证?

1 个答案:

答案 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”的“使用”则表示可以将密钥用于一般进行数字签名操作(签名或验证)。