Message d’erreur
failed to verify signature: failed to verify id token signature
Également affiché sous la forme
- failed to verify signature: fetching keys oidc: get keys failed
Lorsque la requête JWKS elle-même échoue, le texte est « failed to verify signature: fetching keys oidc: get keys failed … », suivi de l’erreur HTTP ou réseau.
coreos/go-oidc (Go) — IDTokenVerifier.Verify with a RemoteKeySet
Ce que cela signifie
go-oidc a téléchargé le jeu de clés du fournisseur (en le récupérant une seconde fois si le `kid` était inconnu), et aucune clé publiée n’a vérifié la signature du jeton. go-oidc ne distingue pas « aucune clé avec ce kid » de « une clé avec ce kid, mais une signature incorrecte » : dans les deux cas, le jeton n’a pas été signé par une clé que ce fournisseur publie actuellement. Si le jeu de clés n’a pas pu être récupéré du tout, le message se poursuit plutôt par « fetching keys … ».
Pourquoi cela se produit
Le jeton provient d’un autre fournisseur ou d’un autre locataire
fréquenteUn jeton d’un locataire de préproduction, d’un autre realm, ou d’un tout autre fournisseur d’identité. Vérifiez `iss` dans la charge utile avant de soupçonner les clés.
Le vérificateur récupère le mauvais jeu de clés
fréquenteUne URL `NewRemoteKeySet` configurée à la main qui pointe vers les clés d’un autre locataire, ou un proxy/cache qui sert un JWKS obsolète après une rotation.
Identifiants de clé réutilisés pour plusieurs clés
occasionnelleLes émetteurs qui réutilisent un `kid` pour une nouvelle clé (par exemple un nom fixe par environnement) produisent des jetons dont le `kid` correspond à une clé publiée qui n’est pas la clé de signature.
Le jeton a été modifié
occasionnelleToute modification de l’en-tête ou de la charge utile après la signature, y compris un nouvel encodage, invalide la signature.
Comment corriger l’erreur
- 1.
Construire le vérificateur à partir de la découverte
`provider.Verifier` utilise le `jwks_uri` du document de découverte du fournisseur ainsi que l’émetteur du fournisseur, ce qui élimine les URL configurées à la main comme source de non-concordance.
go provider, err := oidc.NewProvider(ctx, "https://accounts.example.com") // discovery gives the right jwks_uri if err != nil { return err } verifier := provider.Verifier(&oidc.Config{ClientID: clientID}) idToken, err := verifier.Verify(ctx, rawIDToken) - 2.
Comparer le kid du jeton aux clés publiées
Si le `kid` n’est pas publié, le jeton vient d’ailleurs ou le fournisseur n’a pas terminé une rotation. S’il est publié, la clé correspondante n’a pas signé ce jeton.
bash # kid in the token header vs kids the provider publishes python3 -c 'import base64,json,sys; h=sys.argv[1].split(".")[0]; print(json.loads(base64.urlsafe_b64decode(h+"="*(-len(h)%4))))' "$ID_TOKEN" curl -s "$(curl -s https://accounts.example.com/.well-known/openid-configuration | jq -r .jwks_uri)" | jq '.keys[] | {kid, alg, kty}'