Message d’erreur
SyntaxError: Cannot create a key using the specified key usages.
Également affiché sous la forme
- 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. » ou « 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 ». Testez `e.name === "SyntaxError"`.
WebCrypto SubtleCrypto.importKey / generateKey — DOMException SyntaxError (Chromium / Firefox / WebKit)
Ce que cela signifie
Le tableau `keyUsages` ne convient pas à la clé en cours de création. WebCrypto définit les usages que peut avoir chaque type de clé : une clé publique ECDSA ou RSA ne peut servir qu’à `verify`, une clé privée qu’à `sign` ; les clés publiques ECDH n’acceptent aucun usage ; et il est interdit de créer une clé privée ou une clé secrète avec une liste d’usages vide. Le navigateur rejette l’appel avec une DOMException `SyntaxError` avant que la clé n’existe. C’est différent d’`InvalidAccessError`, que vous obtenez plus tard lorsqu’une clé existante est utilisée pour une opération pour laquelle elle n’a pas été créée.
Pourquoi cela se produit
Une clé publique importée avec sign (ou une clé privée avec verify)
fréquenteCopier le même tableau `["sign", "verify"]` dans chaque appel `importKey` échoue pour les clés isolées : seul `generateKey` répartit la liste entre les deux parties d’une paire.
Une liste d’usages vide
fréquente`generateKey(alg, true, [])` ou l’importation d’une clé privée avec `[]`. Les clés doivent être créées pour au moins un usage.
ECDH et ECDSA confondus
occasionnelleUne clé ECDH importée avec `["sign"]` ou une clé ECDSA avec `["deriveBits"]` échoue : le même point de courbe correspond à un type de clé différent pour chaque algorithme.
Comment corriger l’erreur
- 1.
Donner à chaque clé les usages de son rôle
Clés publiques : `verify` (signatures) ou `[]` (clés ECDH de l’autre partie) ; clés privées : `sign` ou `deriveBits`/`deriveKey`. Gardez des usages minimaux : ils font partie du modèle de moindre privilège de 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, []);
Erreurs associées
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