Aller au contenu
ecdsa.com
golang-jwt/jwt (Go)Go

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

Comment corriger l’erreur

  1. 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. 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"])
    }

Erreurs associées

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