Fehlermeldung
TypeError: Failed to execute 'importKey' on 'SubtleCrypto': The provided value is not of type '(ArrayBuffer or ArrayBufferView or JsonWebKey)'.
Auch ausgegeben als
- TypeError: SubtleCrypto.importKey: Argument 2 is not an object.
- TypeError: Type error
Oben steht der Text von Chromium; Firefox meldet „SubtleCrypto.importKey: Argument 2 is not an object.“, Safari/WebKit nur „Type error“. Node.js meldet für denselben Aufruf `ERR_INVALID_ARG_TYPE`.
WebCrypto SubtleCrypto.importKey — PEM text passed as keyData (Chromium / Firefox / WebKit)
Was der Fehler bedeutet
`importKey` hat als `keyData` einen String erhalten. WebCrypto parst nie Text: Für `"spki"`, `"pkcs8"` und `"raw"` erwartet es binäres DER (einen `ArrayBuffer` oder ein typisiertes Array), für `"jwk"` ein JavaScript-Objekt. Der Browser lehnt den Aufruf schon bei der Konvertierung der Argumente ab, bevor er sich Format oder Schlüssel ansieht – das PEM kann also völlig gültig sein.
Warum der Fehler auftritt
Ein PEM-String wurde direkt übergeben
häufigDer Text `-----BEGIN PUBLIC KEY-----` von einem Server, aus einer Konfigurationsdatei oder aus der Dokumentation einer JWT-Bibliothek. Er muss zuerst mit base64 zu DER dekodiert werden.
Base64-Text statt Bytes
häufigAuch ohne die Rahmenzeilen bleibt ein base64-String ein String. Dekodiere ihn mit `atob` (oder `Uint8Array.fromBase64`, wo verfügbar) in Bytes.
Ein JWK als JSON-Text
gelegentlichBeim Format `"jwk"` scheitert mit `JSON.stringify` erzeugter Text genauso; übergib das geparste Objekt.
So behebst du den Fehler
- 1.
Rahmenzeilen entfernen und in Bytes dekodieren
Entferne die BEGIN/END-Zeilen und den Whitespace, dekodiere mit base64 und wähle das Format anhand des Labels: `PUBLIC KEY` → `spki`, `PRIVATE KEY` → `pkcs8`.
js function pemToDer(pem) { const base64 = pem.replace(/-----(BEGIN|END) [A-Z ]+-----/g, "").replace(/\s+/g, ""); return Uint8Array.from(atob(base64), (c) => c.charCodeAt(0)); } const publicKey = await crypto.subtle.importKey( "spki", pemToDer(publicKeyPem), // "PUBLIC KEY" -> spki, "PRIVATE KEY" -> pkcs8 { name: "ECDSA", namedCurve: "P-256" }, false, ["verify"], ); - 2.
JWKs als Objekte übergeben
JWKS-Endpunkte liefern bereits Objekte; parse JSON-Text einmal und übergib das Objekt mit der passenden Kurve.
js const jwk = JSON.parse(jwkText); // an object, not the JSON string const key = await crypto.subtle.importKey("jwk", jwk, { name: "ECDSA", namedCurve: jwk.crv }, false, ["verify"]);