Message d’erreur
token signature is invalid: signing method ES256 is invalid
Également affiché sous la forme
- signing method ES256 is invalid
- token signature is invalid: signing method HS256 is invalid
- token is unverifiable: signing method (alg) is unavailable
La v4 affiche « signing method ES256 is invalid ». Une valeur `alg` que golang-jwt ne connaît pas du tout (ou `none` sans la constante spéciale) produit plutôt « token is unverifiable: signing method (alg) is unavailable ».
golang-jwt/jwt (Go) — WithValidMethods rejected the token's alg
Ce que cela signifie
L’en-tête `alg` du jeton ne figure pas dans la liste que vous avez passée avec `jwt.WithValidMethods` : golang-jwt l’a donc refusé avant d’appeler votre Keyfunc pour obtenir la clé. Cette vérification existe parce que l’en-tête est contrôlé par l’attaquant : c’est le vérificateur, et non le jeton, qui décide quel algorithme est acceptable. La v5 classe cette erreur sous `ErrTokenSignatureInvalid`, ce qui la fait ressembler à une mauvaise signature ; il s’agit en réalité d’un rejet dû à la politique d’algorithmes.
Pourquoi cela se produit
L’émetteur a changé d’algorithme
fréquenteLes fournisseurs d’identité passent de RS256 à ES256 ou ajoutent des clés EdDSA. Les vérificateurs qui ont figé l’ancien algorithme rejettent tous les nouveaux jetons dès le moment de la bascule.
La liste d’autorisation a été copiée depuis un autre service
occasionnelleUn middleware partagé configuré pour un émetteur (RS256) est réutilisé pour un autre qui signe avec ES256. La liste d’autorisation doit décrire l’émetteur qui se trouve derrière ce vérificateur précis.
Un jeton venu d’ailleurs, ou un sondage
occasionnelleDes jetons avec `alg: HS256` ou `none` qui atteignent une API RS256/ES256 sont typiques des sondages par confusion d’algorithme. Continuez à les rejeter.
Comment corriger l’erreur
- 1.
Autoriser exactement l’algorithme de l’émetteur
Lisez le JWKS de l’émetteur (l’`alg` de chaque clé) ou son document de découverte (`id_token_signing_alg_values_supported`), puis figez ces valeurs. Pendant une migration, listez les deux algorithmes et sélectionnez les clés par `kid`.
go token, err := jwt.Parse(raw, keyfunc, jwt.WithValidMethods([]string{"ES256"}), // what the issuer signs with today jwt.WithIssuer("https://issuer.example.com/"), ) - 2.
Vérifier le type de la méthode dans la Keyfunc
Vérifier le type concret de `t.Method` dans la Keyfunc garantit qu’une clé ECDSA n’est jamais utilisée qu’avec un algorithme ECDSA, même si la liste d’autorisation est élargie par la suite.
go keyfunc := func(t *jwt.Token) (any, error) { // Belt and braces: the key type must fit the algorithm family. if _, ok := t.Method.(*jwt.SigningMethodECDSA); !ok { return nil, fmt.Errorf("unexpected signing method %v", t.Header["alg"]) } return lookupKey(t.Header["kid"]) }