Fehlermeldung
Signed JWT rejected: Another algorithm expected, or no matching key(s) found
Auch ausgegeben als
- 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
Was der Fehler bedeutet
Der Schlüsselselektor von Nimbus hat für dieses Token keinen Kandidatenschlüssel geliefert: Entweder gehört der `alg` des Tokens nicht zu den Algorithmen, die der Selektor akzeptiert, oder kein Schlüssel im JWK-Set passt zu `kid` und Schlüsseltyp des Tokens. Nimbus sagt absichtlich nicht, welcher der beiden Fälle vorliegt. Hinter Spring Security ist das sehr oft der RS256-Standard von `NimbusJwtDecoder`, der auf einen Aussteller trifft, der mit ES256 signiert.
Warum der Fehler auftritt
Der Verifizierer erwartet RS256
häufig`NimbusJwtDecoder` aus Spring Security verwendet RS256, solange du keine Algorithmen konfigurierst (oder er sie in neueren Versionen aus dem JWKS des Ausstellers ermittelt). Keycloak, Auth0, Azure AD B2C und andere können mit ES256/PS256 signieren.
Der kid des Tokens fehlt im JWK-Set
häufigEin rotierter Schlüssel, der noch nicht veröffentlicht ist, ein zwischengespeichertes JWK-Set oder eine JWK-Set-URL, die zu einem anderen Aussteller oder einer anderen Umgebung gehört.
Die Metadaten des Schlüssels schließen ihn aus
gelegentlichJWKs mit `use: "enc"`, einem anderen `alg` oder einem anderen Schlüsseltyp (ein RSA-Schlüsselsatz für ein ES256-Token) werden vom Matcher herausgefiltert.
So behebst du den Fehler
- 1.
Dem Decoder mitteilen, welchen Algorithmus der Aussteller verwendet
`jwsAlgorithm(...)` (oder `jwsAlgorithms(...)`) am Builder ersetzt den RS256-Standard. Beschränke die Liste auf die Algorithmen, die der Aussteller tatsächlich verwendet.
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.
Oder in application.yml konfigurieren
Spring Boot bietet dieselbe Einstellung als `jws-algorithms` an.
yaml spring: security: oauth2: resourceserver: jwt: issuer-uri: https://issuer.example.com/realms/main jws-algorithms: ES256