Zum Inhalt springen
ecdsa.com
WebCrypto SubtleCrypto.importKey / generateKeyWebCrypto

Fehlermeldung

SyntaxError: Cannot create a key using the specified key usages.

Auch ausgegeben als

  • SyntaxError: Usages cannot be empty when creating a key.
  • SyntaxError: An invalid or illegal string was specified
  • SyntaxError: A required parameter was missing or out-of-range

Chromium: „Cannot create a key using the specified key usages.“ oder „Usages cannot be empty when creating a key.“; Firefox: „An invalid or illegal string was specified“; Safari/WebKit: „A required parameter was missing or out-of-range“. Prüfe auf `e.name === "SyntaxError"`.

WebCrypto SubtleCrypto.importKey / generateKey — DOMException SyntaxError (Chromium / Firefox / WebKit)

Was der Fehler bedeutet

Das Array `keyUsages` passt nicht zum Schlüssel, der erzeugt werden soll. WebCrypto legt fest, welche usages jeder Schlüsseltyp haben darf: Bei ECDSA und RSA darf ein öffentlicher Schlüssel nur `verify`, ein privater Schlüssel nur `sign`; öffentliche ECDH-Schlüssel bekommen gar keine usages; und einen privaten oder geheimen Schlüssel mit leerer usages-Liste zu erzeugen, ist nicht erlaubt. Der Browser lehnt den Aufruf mit einer DOMException `SyntaxError` ab, bevor der Schlüssel existiert. Das ist etwas anderes als `InvalidAccessError`, den du später bekommst, wenn ein vorhandener Schlüssel für eine Operation verwendet wird, für die er nicht erzeugt wurde.

Warum der Fehler auftritt

So behebst du den Fehler

  1. 1.

    Jedem Schlüssel die usages seiner Rolle geben

    Öffentliche Schlüssel: `verify` (Signaturen) oder `[]` (ECDH-Schlüssel der Gegenseite); private Schlüssel: `sign` oder `deriveBits`/`deriveKey`. Halte die usages minimal – sie sind Teil des Least-Privilege-Modells von WebCrypto.

    js
    const alg = { name: "ECDSA", namedCurve: "P-256" };
    // Public keys verify, private keys sign:
    const publicKey = await crypto.subtle.importKey("spki", spkiDer, alg, false, ["verify"]);
    const privateKey = await crypto.subtle.importKey("pkcs8", pkcs8Der, alg, false, ["sign"]);
    // ECDH keys derive; their public half takes no usages at all:
    const peer = await crypto.subtle.importKey("raw", point, { name: "ECDH", namedCurve: "P-256" }, false, []);

Verwandte Fehler

Gesamte Signaturfehler-Datenbank durchsuchen