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
Öffentlicher Schlüssel mit sign importiert (oder privater Schlüssel mit verify)
häufigDasselbe Array `["sign", "verify"]` in jeden Aufruf von `importKey` zu kopieren, scheitert bei einzelnen Schlüsseln: Nur `generateKey` verteilt die Liste auf die beiden Hälften eines Paars.
Eine leere usages-Liste
häufig`generateKey(alg, true, [])` oder der Import eines privaten Schlüssels mit `[]`. Schlüssel müssen für mindestens einen Zweck erzeugt werden.
ECDH und ECDSA verwechselt
gelegentlichEin mit `["sign"]` importierter ECDH-Schlüssel oder ein ECDSA-Schlüssel mit `["deriveBits"]` scheitert: Derselbe Kurvenpunkt ist für jeden Algorithmus ein anderer Schlüsseltyp.
So behebst du den Fehler
- 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
InvalidAccessError: Unable to use this key to verifyWebCrypto crypto.subtle.sign / verifyDataError: Data provided to an operation does not meet requirementsWebCrypto crypto.subtle.importKeyInvalidAccessError: Failed to execute 'exportKey' on 'SubtleCrypto': key is not…WebCrypto SubtleCrypto.exportKey / wrapKey