Zum Inhalt springen
ecdsa.com
jsonwebtoken (Node.js)JWT-Bibliotheken

Fehlermeldung

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

Auch ausgegeben als

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

Wird sowohl von `jwt.sign()` als auch von `jwt.verify()` geworfen. Die verlangte Kurve wird in der Schreibweise von OpenSSL genannt: `prime256v1`, `secp384r1`, `secp521r1`.

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

Was der Fehler bedeutet

Der übergebene EC-Schlüssel liegt auf einer anderen Kurve, als der Algorithmus verlangt. In JOSE ist jeder ECDSA-Algorithmus an genau eine Kurve gebunden: ES256 an P-256 (OpenSSL-Name `prime256v1`), ES384 an P-384 (`secp384r1`), ES512 an P-521 (`secp521r1`). Seit Version 9 gleicht jsonwebtoken die Kurve des Schlüssels vor dem Signieren oder Prüfen mit dem `alg` ab, sodass ein unpassender Schlüssel von vornherein abgelehnt wird, statt Tokens zu erzeugen, die keine andere Bibliothek akzeptiert.

Warum der Fehler auftritt

So behebst du den Fehler

  1. 1.

    Kurve des Schlüssels ausgeben

    `asymmetricKeyDetails.namedCurve` nennt die Kurve in der Benennung von OpenSSL. Vergleiche sie mit dem Algorithmus im Header des Tokens.

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

    Algorithmus aus dem Schlüssel ableiten

    Sind Schlüssel unterschiedlicher Größe im Einsatz, wähle den JWS-Algorithmus anhand der Kurve des Schlüssels, statt ES256 fest im Code zu hinterlegen, und veröffentliche denselben `alg` in deinem 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.

    P-256-Schlüssel generieren, wenn du ES256 brauchst

    ES256 ist der in JOSE-Bibliotheken am breitesten unterstützte ECDSA-Algorithmus; ein neues P-256-Schlüsselpaar erzeugst du mit einem einzigen Befehl.

    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

Verwandte Fehler

Gesamte Signaturfehler-Datenbank durchsuchen