Pular para o conteúdo
ecdsa.com
jsonwebtoken (Node.js)Bibliotecas de JWT

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

Como corrigir

  1. 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. 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. 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

Erros relacionados

Ver toda a base de erros de assinatura