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

Message d’erreur

token signature is invalid: key is of invalid type: ECDSA verify expects *ecdsa.PublicKey

Également affiché sous la forme

  • token signature is invalid: key is of invalid type: HMAC verify expects []byte
  • token signature is invalid: key is of invalid type: RSA verify expects *rsa.PublicKey
  • key is of invalid type: ECDSA sign expects *ecdsa.PrivateKey
  • key is of invalid type

La v5 nomme le type attendu (« ECDSA verify expects *ecdsa.PublicKey », « HMAC verify expects []byte ») ; la v4 affiche seulement « key is of invalid type ». Comme la v5 la classe sous `ErrTokenSignatureInvalid`, l’erreur ressemble à première vue à un échec de signature.

golang-jwt/jwt (Go) — jwt.ErrInvalidKeyType

Ce que cela signifie

La valeur renvoyée par votre `Keyfunc` (ou la clé passée à `SignedString`) n’a pas le bon type Go pour l’algorithme du jeton. golang-jwt effectue une assertion de type sur la clé : la vérification ES* exige `*ecdsa.PublicKey`, RS*/PS* exigent `*rsa.PublicKey`, EdDSA exige `ed25519.PublicKey`, HS* exige `[]byte` ; la signature exige la clé privée correspondante. Aucune opération cryptographique n’a eu lieu : la clé n’a même pas pu se révéler incorrecte, ce n’était tout simplement pas le bon type d’objet.

Pourquoi cela se produit

Comment corriger l’erreur

  1. 1.

    Analyser le PEM une seule fois en clé typée

    golang-jwt fournit des fonctions utilitaires pour chaque type de clé. Analysez la clé au démarrage et renvoyez la clé typée depuis la Keyfunc.

    go
    pub, err := jwt.ParseECPublicKeyFromPEM(pemBytes)      // ES256/384/512
    // rsaPub, err := jwt.ParseRSAPublicKeyFromPEM(pemBytes) // RS*/PS*
    // edPub, err := jwt.ParseEdPublicKeyFromPEM(pemBytes)   // EdDSA
    if err != nil {
    	log.Fatal(err)
    }
    token, err := jwt.Parse(raw, func(t *jwt.Token) (any, error) { return pub, nil },
    	jwt.WithValidMethods([]string{"ES256"}))
  2. 2.

    Renvoyer les secrets HMAC sous forme de []byte

    Convertissez le secret en octets et limitez `WithValidMethods` à l’algorithme HMAC, afin que les jetons dont l’`alg` est asymétrique ne puissent pas atteindre ce chemin de code.

    go
    secret := []byte(os.Getenv("JWT_HMAC_SECRET")) // []byte, not string
    token, err := jwt.Parse(raw, func(t *jwt.Token) (any, error) { return secret, nil },
    	jwt.WithValidMethods([]string{"HS256"}))

Erreurs associées

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