已签名的 JWT 和 JWK 之间的 jose4j 算法不匹配

jose4j algorithm mismatch between signed JWT and JWK

在单元测试期间,我注意到一些预期的行为。

我用你的代码生成了一个 RsaJsonWebKey 密钥对。创建后,我将算法设置为 RS512。我基于此创建了一个 public JWK。那时,密钥对和 JWK 具有相同的密钥 ID、算法和签名。接下来在 UT 中,我将 JWK 的算法更改为 RS256。我预计这会失败,但它仍然匹配并验证。 当然,key-id 和最重要的是,签名仍然匹配。算法真的有必要吗?查看 Jose4J 源代码,它似乎从未设置为与 JWK 匹配。

在方法中 SimpleJwkFilter.filter()

匹配 &= isMatch(alg, jwk.getAlgorithm()); <-- alg 从未设置,因此通过 isMatch

我假设您正在使用 VerificationJwkSelector(由 JwksVerificationKeyResolverHttpsJwksVerificationKeyResolver 使用)。它使用 SimpleJwkFilter 但只告诉它在 JWK 上使用 'alg' 作为选择标准,当第一次尝试过滤时会产生多个键时作为消歧技术。参见:https://bitbucket.org/b_c/jose4j/src/b577cb539b09cb691e848244dea1769c3f7921b9/src/main/java/org/jose4j/jwk/VerificationJwkSelector.java#lines-42

我 运行 在某些情况下 'alg' 在 JWKS 内容中设置不正确,并且在初始选择中考虑它排除了实际的验证密钥。 VerificationJwkSelector 行为旨在适应不正确的 'alg' 值。

2015 年的一个单元测试中 JWKS 的算法值有问题: https://bitbucket.org/b_c/jose4j/src/b577cb539b09cb691e848244dea1769c3f7921b9/src/test/java/org/jose4j/jwk/VerificationJwkSelectorTest.java#lines-349