Fehlermeldung
Invalid JWK EC key
Node.js crypto — TypeError, code ERR_CRYPTO_INVALID_JWK
Was der Fehler bedeutet
createPublicKey/createPrivateKey mit format: „jwk“ hat das JWK-Objekt abgelehnt: Pflichtfelder fehlen, Koordinaten lassen sich nicht dekodieren, oder der Punkt (x, y) liegt gar nicht auf der angegebenen Kurve. Node prüft den Punkt beim Import, deshalb fällt eine beschädigte oder abgeschnittene Koordinate schon hier auf, statt einen Schlüssel zu ergeben, mit dem sich nie eine Signatur bestätigen lässt. Dieselben Prüfungen laufen, ob der JWK nun von einem JWKS-Endpunkt, aus einer Konfigurationsdatei oder von einem anderen Dienst stammt – der Fehler belastet das Objekt, nicht den Transportweg.
Warum der Fehler auftritt
Koordinaten nicht in base64url
häufigx/y/d eines JWK müssen base64url ohne Padding sein (RFC 7518). Hex-Strings und Dezimalzahlen ergeben beim Dekodieren nicht die für P-256 erwarteten 32 Byte. Bei einer Variante ist Node nachsichtig: base64 im Standardalphabet mit + / und Padding durch = wird ohne Beanstandung importiert, während Browser denselben JWK mit einem DataError ablehnen – ein Schlüssel, der auf dem Server funktioniert, kann im Client trotzdem scheitern.
Abgeschnittene oder beschädigte Koordinate
häufigEine Koordinate, die unterwegs ein Zeichen verloren hat oder in der eines verändert wurde, beschreibt eine andere Zahl, und der Punkt liegt nicht mehr auf der Kurve. Der klassische Bug mit führenden Nullen – ein Encoder schreibt 31 Byte, weil das erste Byte null war – ist die einzige Kürzung, die Node durchgehen lässt: Die Zahl bleibt dieselbe, also lässt sich der Schlüssel importieren. Browser lehnen denselben JWK ab („should be 32“, gemeint sind Byte), deshalb lohnt sich die Korrektur trotzdem.
crv passt nicht zum Schlüsselmaterial
gelegentlichEin JWK mit crv: „P-256“, der secp256k1- oder P-384-Koordinaten enthält (nach manueller Bearbeitung oder per Copy-and-paste aus einer Vorlage), kann keinen Punkt auf der angegebenen Kurve beschreiben.
So behebst du den Fehler
- 1.
Form des JWK vor dem Import prüfen
Prüfe die Felder und die dekodierten Längen. Bei P-256 müssen x und y dekodiert jeweils genau 32 Byte ergeben.
js const x = Buffer.from(jwk.x, "base64url"); const y = Buffer.from(jwk.y, "base64url"); console.log(jwk.kty, jwk.crv, x.length, y.length); // EC P-256 32 32 - 2.
Zu kurze Koordinaten links auffüllen
Hat ein Erzeuger führende Nullen entfernt, stelle die feste Länge wieder her, bevor du den JWK zusammenbaust.
js const pad32 = (b) => Buffer.concat([Buffer.alloc(32 - b.length), b]); jwk.x = pad32(Buffer.from(jwk.x, "base64url")).toString("base64url"); jwk.y = pad32(Buffer.from(jwk.y, "base64url")).toString("base64url"); const key = crypto.createPublicKey({ key: jwk, format: "jwk" }); - 3.
Aus vertrauenswürdiger Quelle neu beziehen
Fallen Koordinaten durch die Prüfung und hast du den JWK nicht selbst gebaut, hol ihn erneut vom JWKS-Endpunkt des Ausstellers, statt Bytes zu reparieren – einem JWK, an dem du erst herumoperieren musst, solltest du nicht vertrauen.