Aller au contenu
ecdsa.com
WebCrypto SubtleCrypto.importKey / generateKeyWebCrypto

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

Comment corriger l’erreur

  1. 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

Parcourir toute la base de données des erreurs de signature