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
Una clave secp256k1 con ES256
frecuentesecp256k1 (Bitcoin, Ethereum) es otra curva de 256 bits. Su algoritmo JOSE es `ES256K` (RFC 8812), que jsonwebtoken no admite; el «256» de ES256 se refiere solo a SHA-256 y P-256.
Una clave P-384 o P-521 con ES256
ocasionalLas claves generadas con los valores predeterminados de OpenSSL o con una especificación de clave de un KMS en la nube como `ECC_NIST_P384`, y las claves de certificado que dicta el perfil de una CA, pueden usar una curva mayor. Elige el algoritmo que corresponde a la clave (ES384/ES512) o genera una clave P-256.
Se cargó el archivo de clave equivocado
ocasionalHay varias claves en un mismo almacén de secretos y el servicio lee la destinada a otro uso: una clave TLS, una clave SSH, una clave de firma de otro sistema.
Cómo solucionarlo
- 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.
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.
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