Message d’erreur
InvalidAccessError: Unable to use this key to verify
Le texte ci-dessus est celui de Node (sign donne « Unable to use this key to sign », et une clé d’un autre algorithme « Key algorithm mismatch »). Les navigateurs le formulent autrement (Chrome « key.usages does not permit this operation », Firefox « A parameter or an operation is not supported by the underlying object », Safari « CryptoKey doesn't support verification »), mais le nom de la DOMException, InvalidAccessError, est le même partout.
WebCrypto crypto.subtle.sign / verify — browsers & Node
Ce que cela signifie
L’objet clé que vous avez passé n’est pas autorisé à effectuer cette opération : son tableau d’usages ne l’inclut pas, ou la classe de clé est la mauvaise (vérifier avec une clé privée, signer avec une clé publique), ou la clé appartient à un autre algorithme que celui que demande l’appel. Le contenu de la clé peut être parfaitement valide ; ce sont ses autorisations ou son rôle qui ne le sont pas.
Pourquoi cela se produit
usages n’incluait pas l’opération à l’importation
fréquenteLes clés WebCrypto suivent le principe du moindre privilège : importKey(..., ["verify"]) produit une clé qui ne peut que vérifier. Importer avec [] ou avec ["sign"] puis appeler verify() échoue ici ; les usages sont fixés à la création et ne peuvent pas être ajoutés par la suite.
Parties publique et privée inversées
fréquentesubtle.sign exige la clé privée ; subtle.verify exige la clé publique. Passer keyPair.publicKey à sign (ou privateKey à verify) est une erreur de rôle que l’API refuse d’emblée.
L’algorithme de la clé diffère de celui de l’opération
occasionnelleUne clé ECDH utilisée dans un appel sign ECDSA (ou l’inverse) échoue même sur la même courbe : WebCrypto lie les clés à l’algorithme pour lequel elles ont été créées, si bien que les conceptions « une seule clé EC pour les deux » doivent importer le contenu de la clé deux fois.
Comment corriger l’erreur
- 1.
Déclarer les usages dont vous aurez besoin
Listez chaque opération prévue lors de la génération ou de l’importation ; réimportez le même contenu de clé avec des usages différents lorsqu’une clé remplit plusieurs rôles.
js const keyPair = await crypto.subtle.generateKey( { name: "ECDSA", namedCurve: "P-256" }, true, ["sign", "verify"], // privateKey gets "sign", publicKey gets "verify" ); - 2.
Passer la bonne partie à chaque appel
Inspectez key.type et key.usages lors du débogage : ils indiquent exactement ce que l’objet est autorisé à faire.
js console.log(key.type, key.usages); // e.g. "public" ["verify"] const sig = await crypto.subtle.sign(alg, keyPair.privateKey, data); const ok = await crypto.subtle.verify(alg, keyPair.publicKey, sig, data);