Saltar al contenido
ecdsa.com
jsonwebtoken (Node.js)Bibliotecas de JWT

Mensaje de error

"alg" parameter "ES256" requires curve "prime256v1".

También se muestra como

  • "alg" parameter "ES384" requires curve "secp384r1".
  • "alg" parameter "ES512" requires curve "secp521r1".

Lo lanzan tanto `jwt.sign()` como `jwt.verify()`. La curva exigida aparece con el nombre que usa OpenSSL: `prime256v1`, `secp384r1`, `secp521r1`.

jsonwebtoken (Node.js) — Error from jwt.sign() / jwt.verify() key validation (v9+)

Qué significa

La clave EC que pasas está en una curva distinta de la que exige el algoritmo. En JOSE, cada algoritmo ECDSA está ligado a una única curva: ES256 a P-256 (nombre de OpenSSL `prime256v1`), ES384 a P-384 (`secp384r1`) y ES512 a P-521 (`secp521r1`). Desde la versión 9, jsonwebtoken comprueba la curva de la clave frente al `alg` antes de firmar o verificar, así que una clave que no corresponde se rechaza de entrada en lugar de producir tokens que ninguna otra biblioteca acepta.

Por qué ocurre

Cómo solucionarlo

  1. 1.

    Imprimir la curva de la clave

    `asymmetricKeyDetails.namedCurve` indica la curva con la nomenclatura de OpenSSL. Compárala con el algoritmo del encabezado del token.

    js
    import { createPublicKey } from "node:crypto";
    
    const key = createPublicKey(pem);
    console.log(key.asymmetricKeyType, key.asymmetricKeyDetails); // ec { namedCurve: 'prime256v1' }
  2. 2.

    Deducir el algoritmo a partir de la clave

    Si usas claves de distintos tamaños, elige el algoritmo JWS según la curva de la clave en lugar de fijar ES256 en el código, y publica el mismo `alg` en tu JWKS.

    js
    const ALG_BY_CURVE = { prime256v1: "ES256", secp384r1: "ES384", secp521r1: "ES512" };
    const alg = ALG_BY_CURVE[key.asymmetricKeyDetails.namedCurve];
    if (!alg) throw new Error("this curve has no JWS algorithm in jsonwebtoken");
    const token = jwt.sign(claims, key, { algorithm: alg, expiresIn: "10m" });
  3. 3.

    Generar una clave P-256 si necesitas ES256

    ES256 es el algoritmo ECDSA más admitido en las bibliotecas JOSE; un nuevo par de claves P-256 se genera con un solo comando.

    bash
    openssl genpkey -algorithm EC -pkeyopt ec_paramgen_curve:P-256 -out es256-private.pem
    openssl pkey -in es256-private.pem -pubout -out es256-public.pem

Errores relacionados

Explorar toda la base de datos de errores de firma