Message d’erreur
TypeError: Failed to execute 'sign' on 'SubtleCrypto': EcdsaParams: hash: Missing or not an AlgorithmIdentifier
Également affiché sous la forme
- TypeError: Failed to execute 'verify' on 'SubtleCrypto': EcdsaParams: hash: Missing or not an AlgorithmIdentifier
- TypeError: Member EcdsaParams.hash is required and must be an instance of (object or DOMString)
- NotSupportedError: Failed to execute 'sign' on 'SubtleCrypto': EcdsaParams: hash: Algorithm: Unrecognized name
Le texte ci-dessus est celui de Chromium (pour `verify`, le nom de la méthode change) ; Safari/WebKit : « Member EcdsaParams.hash is required and must be an instance of (object or DOMString) » ; Firefox signale une `SyntaxError` générique (« An invalid or illegal string was specified »).
WebCrypto SubtleCrypto.sign / verify with ECDSA — algorithm parameter without hash (Chromium / WebKit)
Ce que cela signifie
Dans WebCrypto, ECDSA reçoit la fonction de hachage à chaque opération, et non avec la clé : `sign` et `verify` exigent `{ name: "ECDSA", hash: "SHA-256" }`. L’appel a passé un objet d’algorithme sans `hash` (généralement l’objet `{ name, namedCurve }` de la génération de clé), et le navigateur a donc rejeté les paramètres avant de signer. (Les clés RSA font l’inverse : leur fonction de hachage est fixée à l’importation.) Un nom d’algorithme de hachage mal orthographié, comme `"SHA256"`, échoue en revanche avec une `NotSupportedError` signalant un nom non reconnu.
Pourquoi cela se produit
Les paramètres de génération de clé réutilisés pour sign/verify
fréquenteStocker une seule constante `ALG = { name: "ECDSA", namedCurve: "P-256" }` et la passer partout fonctionne pour `generateKey` et `importKey`, mais `sign` a besoin de `hash`.
Nom d’algorithme de hachage écrit à la manière de JOSE ou d’OpenSSL
fréquenteLes noms WebCrypto sont `SHA-256`, `SHA-384`, `SHA-512` (avec le tiret). `SHA256`, `sha256` sans tiret ou `ES256` ne sont pas reconnus.
S’attendre à ce que la clé porte la fonction de hachage
occasionnelleLe code porté depuis RSA (les clés `RSASSA-PKCS1-v1_5` ont `hash` dans leurs paramètres d’importation) suppose qu’il en va de même pour les clés ECDSA ; ce n’est pas le cas.
Comment corriger l’erreur
- 1.
Séparer les paramètres de clé et les paramètres d’opération
Définissez un objet pour la création de clé et un autre pour la signature. Pour les JWT ES256/ES384/ES512, utilisez respectivement SHA-256/384/512 avec P-256/384/521.
js const KEY_ALG = { name: "ECDSA", namedCurve: "P-256" }; // generateKey / importKey const SIGN_ALG = { name: "ECDSA", hash: "SHA-256" }; // sign / verify (ES256) const pair = await crypto.subtle.generateKey(KEY_ALG, false, ["sign", "verify"]); const signature = await crypto.subtle.sign(SIGN_ALG, pair.privateKey, data); // 64 bytes, raw r||s const ok = await crypto.subtle.verify(SIGN_ALG, pair.publicKey, signature, data);