Zum Inhalt springen
ecdsa.com
WebCrypto SubtleCrypto.importKeyWebCrypto

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

So behebst du den Fehler

  1. 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. 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"]);

Verwandte Fehler

Gesamte Signaturfehler-Datenbank durchsuchen