エラーメッセージ
Signed JWT rejected: Another algorithm expected, or no matching key(s) found
別の表記
- com.nimbusds.jose.proc.BadJOSEException: Signed JWT rejected: Another algorithm expected, or no matching key(s) found
- org.springframework.security.oauth2.jwt.BadJwtException: An error occurred while attempting to decode the Jwt: Signed JWT rejected: Another algorithm expected, or no matching key(s) found
Nimbus JOSE + JWT (Java) — BadJOSEException from DefaultJWTProcessor; also surfaced by Spring Security's NimbusJwtDecoder
このエラーの意味
Nimbus の鍵セレクターが、このトークンに対する候補の鍵を 1 つも返しませんでした。トークンの `alg` がセレクターの受け付けるアルゴリズムに含まれていないか、JWK セット内にトークンの `kid` と鍵の種類に一致する鍵がないかのどちらかです。Nimbus は、どちらだったのかをあえて示しません。Spring Security 経由でこのエラーが出る場合は、`NimbusJwtDecoder` のデフォルトの RS256 が、ES256 で署名する発行者のトークンを受け取ったことが原因であることが非常に多くあります。
発生する理由
検証者が RS256 を想定している
よくあるSpring Security の `NimbusJwtDecoder` は、アルゴリズムを設定しない限り(または新しいバージョンで発行者の JWKS からアルゴリズムを検出しない限り)RS256 を使います。Keycloak、Auth0、Azure AD B2C などは ES256/PS256 で署名することがあります。
トークンの kid が JWK セットにない
よくあるローテーションで導入された鍵がまだ公開されていない、JWK セットがキャッシュされている、別の発行者や環境の JWK セット URL を使っている、といったケースです。
鍵のメタデータによって鍵が除外されている
ときどき`use: "enc"` を持つ JWK、`alg` が異なる JWK、種類の異なる鍵の JWK(ES256 のトークンに対する RSA の鍵セットなど)は、マッチャーによって除外されます。
修正方法
- 1.
発行者が使うアルゴリズムをデコーダーに指定する
ビルダーで `jwsAlgorithm(...)`(または `jwsAlgorithms(...)`)を指定すると、デフォルトの RS256 が置き換えられます。リストには、発行者が実際に使うアルゴリズムだけを含めてください。
java @Bean JwtDecoder jwtDecoder() { return NimbusJwtDecoder.withIssuerLocation("https://issuer.example.com/realms/main") .jwsAlgorithm(SignatureAlgorithm.ES256) // the issuer's algorithm; RS256 is only the default .build(); } - 2.
または application.yml で設定する
Spring Boot では、同じ設定を `jws-algorithms` として指定できます。
yaml spring: security: oauth2: resourceserver: jwt: issuer-uri: https://issuer.example.com/realms/main jws-algorithms: ES256