Mensagem de erro
"alg" parameter "ES256" requires curve "prime256v1".
Também aparece como
- "alg" parameter "ES384" requires curve "secp384r1".
- "alg" parameter "ES512" requires curve "secp521r1".
O erro é lançado tanto por `jwt.sign()` quanto por `jwt.verify()`. A curva exigida aparece com o nome usado pelo OpenSSL: `prime256v1`, `secp384r1`, `secp521r1`.
jsonwebtoken (Node.js) — Error from jwt.sign() / jwt.verify() key validation (v9+)
O que significa
A chave EC que você passou está em uma curva diferente da que o algoritmo exige. No JOSE, cada algoritmo ECDSA está vinculado a exatamente uma curva: ES256 à P-256 (nome no OpenSSL: `prime256v1`), ES384 à P-384 (`secp384r1`), ES512 à P-521 (`secp521r1`). Desde a versão 9, o jsonwebtoken confere a curva da chave com o `alg` antes de assinar ou verificar, então uma chave incompatível é rejeitada logo de início, em vez de produzir tokens que nenhuma outra biblioteca aceita.
Por que acontece
Uma chave secp256k1 com ES256
comumA secp256k1 (Bitcoin, Ethereum) é outra curva de 256 bits. O algoritmo JOSE dela é `ES256K` (RFC 8812), que o jsonwebtoken não aceita; o “256” de ES256 se refere apenas a SHA-256 e P-256.
Uma chave P-384 ou P-521 com ES256
ocasionalChaves geradas com os padrões do OpenSSL, com uma especificação de chave de KMS na nuvem como `ECC_NIST_P384` ou a chave de um certificado gerada conforme o perfil de uma CA podem usar uma curva maior. Escolha o algoritmo que corresponde à chave (ES384/ES512) ou gere uma chave P-256.
O arquivo de chave errado foi carregado
ocasionalVárias chaves no mesmo cofre de segredos, e o serviço lê a que se destina a outra finalidade — uma chave TLS, uma chave SSH, uma chave de assinatura de outro sistema.
Como corrigir
- 1.
Imprimir a curva da chave
A propriedade `asymmetricKeyDetails.namedCurve` informa a curva com a nomenclatura do OpenSSL. Compare-a com o algoritmo no cabeçalho do token.
js import { createPublicKey } from "node:crypto"; const key = createPublicKey(pem); console.log(key.asymmetricKeyType, key.asymmetricKeyDetails); // ec { namedCurve: 'prime256v1' } - 2.
Derivar o algoritmo da chave
Se houver chaves de tamanhos diferentes em uso, escolha o algoritmo JWS a partir da curva da chave em vez de fixar ES256 no código, e publique o mesmo `alg` no seu 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.
Gerar uma chave P-256 quando precisar de ES256
O ES256 é o algoritmo ECDSA mais amplamente aceito pelas bibliotecas JOSE; gerar um novo par de chaves P-256 leva um único 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