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
Ein secp256k1-Schlüssel mit ES256
häufigsecp256k1 (Bitcoin, Ethereum) ist eine andere 256-Bit-Kurve. Ihr JOSE-Algorithmus ist `ES256K` (RFC 8812), den jsonwebtoken nicht unterstützt; die „256“ in ES256 bezieht sich nur auf SHA-256 und P-256.
Ein P-384- oder P-521-Schlüssel mit ES256
gelegentlichSchlüssel, die mit den Standardeinstellungen von OpenSSL, mit einer Schlüsselspezifikation eines Cloud-KMS wie `ECC_NIST_P384` oder als Zertifikatsschlüssel nach einem CA-Profil erzeugt wurden, können eine größere Kurve verwenden. Wähle den Algorithmus, der zum Schlüssel passt (ES384/ES512), oder generiere einen P-256-Schlüssel.
Die falsche Schlüsseldatei wurde geladen
gelegentlichMehrere Schlüssel liegen in einem Secrets-Store, und der Dienst liest den, der für einen anderen Zweck gedacht ist – einen TLS-Schlüssel, einen SSH-Schlüssel, einen Signaturschlüssel für ein anderes System.
So behebst du den Fehler
- 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.
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.
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