Saltar al contenido
ecdsa.com
golang-jwt/jwt (Go)Go

Mensaje de error

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

También se muestra como

  • 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 nombra el tipo esperado («ECDSA verify expects *ecdsa.PublicKey», «HMAC verify expects []byte»); la v4 solo imprime «key is of invalid type». Como la v5 lo clasifica como `ErrTokenSignatureInvalid`, a primera vista parece un fallo de firma.

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

Qué significa

El valor que devuelve tu `Keyfunc` (o la clave que se pasa a `SignedString`) tiene el tipo de Go equivocado para el algoritmo del token. golang-jwt hace una aserción de tipo sobre la clave: la verificación ES* necesita `*ecdsa.PublicKey`, RS*/PS* necesitan `*rsa.PublicKey`, EdDSA necesita `ed25519.PublicKey` y HS* necesita `[]byte`; para firmar hace falta la clave privada correspondiente. No se llega a ejecutar nada criptográfico: la clave no tuvo ocasión de ser incorrecta, porque era un objeto de otro tipo.

Por qué ocurre

Cómo solucionarlo

  1. 1.

    Convertir el PEM en una clave tipada una sola vez

    golang-jwt incluye funciones auxiliares para cada tipo de clave. Analiza el PEM al arrancar y devuelve la clave tipada desde 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.

    Devolver los secretos HMAC como []byte

    Convierte el secreto a bytes y fija `WithValidMethods` en el algoritmo HMAC para que los tokens con un `alg` asimétrico no puedan llegar a esa ruta de código.

    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"}))

Errores relacionados

Explorar toda la base de datos de errores de firma