尝试解码 Jwt 时发生错误:签名 JWT 被拒绝:需要另一种算法,或找不到匹配的密钥

问题描述 投票:0回答:4

我正在尝试设置 OAuth2-OpenID Connect 与与 Spring Security 集成的 ForgeRock OpenAM,但收到以下错误

2019-06-17 15:01:42.576 DEBUG 62255 --- [nio-8090-exec-2] .o.s.r.w.BearerTokenAuthenticationFilter : 
Authentication request for failed: org.springframework.security.oauth2.core.OAuth2AuthenticationException: 
An error occurred while attempting to decode the Jwt: 
Signed JWT rejected: Another algorithm expected, or no matching key(s) found

Jwk .well-known uri 返回以下支持的算法:

"id_token_signing_alg_values_supported": [
    "PS384",
    "ES384",
    "RS384",
    "HS256",
    "HS512",
    "ES256",
    "RS256",
    "HS384",
    "ES512",
    "PS256",
    "PS512",
    "RS512"
  ]

解码后的 JWT 显示以下标头:

{
  "typ": "JWT",
  "zip": "NONE",
  "alg": "HS256"
}

有没有一种方法可以根据来自标头的值设置特定的 JwtDecoder 或强制 AM 使用一种特定算法?

spring-security openam spring-oauth2 forgerock
4个回答
8
投票

问题出在访问管理中令牌加密的配置上。它是空白的,但由于某种原因,JWT 标头显示 HS256,这导致 spring 查找 HS256 私钥并失败。当我将设置更改为使用 RS256 后,一切都开始工作了。


6
投票

就我而言,默认情况下

NimbusJwtDecoder
RS256
作为 JwsAlgo。所以我配置了
JWTDecoder
并提供了我在 JWT 标头中找到的
RS512
算法。

{“alg”:“RS512”,“typ”:“JWT”}

@Configuration
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {

    @Value("${spring.security.oauth2.resourceserver.jwt.jwk-set-uri}")
    private String jwkSetUri;

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests().anyRequest().authenticated().and().oauth2ResourceServer().jwt().decoder(jwtDecoder());
    }

    @Bean
    public JwtDecoder jwtDecoder() {
        return NimbusJwtDecoder.withJwkSetUri(jwkSetUri).jwsAlgorithm(SignatureAlgorithm.RS512).build();
    }
}

1
投票

是的,您可以告诉 AM 使用特定的签名算法进行 OIDC id 令牌签名(https://backstage.forgerock.com/docs/am/6.5/oidc1-guide/#configure-oauth2-oidc-client-signing ),但我怀疑客户端由于缺少密钥而无法验证签名。

只是为了确保...您知道 OAuth2 和 OIDC 是不同的主题..


0
投票

获取此类错误的另一种方法是身份验证路径中是否存在 JWT URI 不一致。

例如,JWT 颁发者 URI 可能已在服务器端使用特定区域或用户池进行硬编码,例如“https://cognito-idp.us-east-1.amazonaws.com/us-east-1_abcdefghi” .

使用硬编码值时要小心。

© www.soinside.com 2019 - 2024. All rights reserved.