0

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

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

在 SimpleJwkFilter.filter() 方法中

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

4

1 回答 1

0

我假设您正在使用VerificationJwkSelector(由JwksVerificationKeyResolverand使用HttpsJwksVerificationKeyResolver)。SimpleJwkFilter当第一次尝试过滤导致多个键时,它使用但仅告诉它使用 JWK 上的“alg”作为选择标准作为消歧技术。请参阅:https ://bitbucket.org/b_c/jose4j/src/b577cb539b09cb691e848244dea1769c3f7921b9/src/main/java/org/jose4j/jwk/VerificationJwkSelector.java#lines-42

我遇到了一些情况,其中 JWKS 内容中的“alg”设置不正确,并且在初始选择中考虑它排除了实际的验证密钥。该VerificationJwkSelector行为旨在适应不正确的“alg”值。

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

于 2018-06-01T19:57:29.303 回答