Aller au contenu
ecdsa.com
Nimbus JOSE + JWT (Java)Java

Message d’erreur

Signed JWT rejected: Invalid signature

Également affiché sous la forme

  • com.nimbusds.jose.proc.BadJWSException: Signed JWT rejected: Invalid signature
  • org.springframework.security.oauth2.jwt.BadJwtException: An error occurred while attempting to decode the Jwt: Signed JWT rejected: Invalid signature

Nimbus JOSE + JWT (Java) — BadJWSException from DefaultJWTProcessor; also surfaced by Spring Security's NimbusJwtDecoder

Ce que cela signifie

Nimbus a sélectionné une ou plusieurs clés candidates pour le jeton (selon le `kid`, l’`alg` et le type de clé), et aucune d’elles n’a vérifié la signature. La sélection a réussi (sinon vous verriez « Another algorithm expected, or no matching key(s) found ») : les clés auxquelles vous faites confiance et celle qui a signé le jeton sont donc différentes, ou bien le jeton a été modifié. Spring Security signale la même situation via `NimbusJwtDecoder`, avec le préfixe « An error occurred while attempting to decode the Jwt: ».

Pourquoi cela se produit

Comment corriger l’erreur

  1. 1.

    Configurer l’émetteur, pas un jeu de clés copié à la main

    Avec `issuer-uri`, Spring Security lit `jwks_uri` dans le document de découverte de l’émetteur et valide aussi `iss`.

    yaml
    # Spring Boot resource server: derive the JWK Set from the issuer's discovery document
    spring:
      security:
        oauth2:
          resourceserver:
            jwt:
              issuer-uri: https://issuer.example.com/realms/main
  2. 2.

    Comparer les empreintes, pas seulement les valeurs kid

    Les empreintes RFC 7638 identifient le matériel de clé lui-même. Si l’empreinte de la clé publiée diffère de celle de la clé avec laquelle l’émetteur signe, le `kid` est réutilisé.

    java
    SignedJWT jwt = SignedJWT.parse(token);
    System.out.println(jwt.getHeader().getKeyID() + " " + jwt.getHeader().getAlgorithm());
    JWKSet set = JWKSet.load(new java.net.URI("https://issuer.example.com/.well-known/jwks.json").toURL());
    for (JWK key : set.getKeys()) {
      System.out.println(key.getKeyID() + " " + key.getAlgorithm() + " thumbprint=" + key.computeThumbprint());
    }

Erreurs associées

Parcourir toute la base de données des erreurs de signature