Message d’erreur
TypeError: Failed to execute 'importKey' on 'SubtleCrypto': The provided value is not of type '(ArrayBuffer or ArrayBufferView or JsonWebKey)'.
Également affiché sous la forme
- TypeError: SubtleCrypto.importKey: Argument 2 is not an object.
- TypeError: Type error
Le texte ci-dessus est celui de Chromium ; Firefox affiche « SubtleCrypto.importKey: Argument 2 is not an object. », Safari/WebKit simplement « Type error ». Node.js signale `ERR_INVALID_ARG_TYPE` pour le même appel.
WebCrypto SubtleCrypto.importKey — PEM text passed as keyData (Chromium / Firefox / WebKit)
Ce que cela signifie
`importKey` a reçu une chaîne comme `keyData`. WebCrypto n’analyse jamais de texte : pour `"spki"`, `"pkcs8"` et `"raw"`, il attend du DER binaire (un `ArrayBuffer` ou un tableau typé) ; pour `"jwk"`, un objet JavaScript. Le navigateur rejette l’appel pendant la conversion des arguments, avant d’examiner le format ou la clé : le PEM peut donc être parfaitement valide.
Pourquoi cela se produit
Une chaîne PEM a été passée directement
fréquenteLe texte `-----BEGIN PUBLIC KEY-----` provenant d’un serveur, d’un fichier de configuration ou de la documentation d’une bibliothèque JWT. Il faut d’abord le décoder du base64 vers le DER.
Du texte Base64 au lieu d’octets
fréquenteMême sans les lignes d’armure, une chaîne base64 reste une chaîne. Décodez-la en octets avec `atob` (ou avec `Uint8Array.fromBase64` lorsqu’il est disponible).
Une JWK sous forme de texte JSON
occasionnellePour le format `"jwk"`, un texte produit par `JSON.stringify` échoue de la même façon ; passez l’objet analysé.
Comment corriger l’erreur
- 1.
Retirer l’armure et décoder en octets
Supprimez les lignes BEGIN/END et les blancs, décodez le base64 et choisissez le format d’après le libellé : `PUBLIC KEY` → `spki`, `PRIVATE KEY` → `pkcs8`.
js function pemToDer(pem) { const base64 = pem.replace(/-----(BEGIN|END) [A-Z ]+-----/g, "").replace(/\s+/g, ""); return Uint8Array.from(atob(base64), (c) => c.charCodeAt(0)); } const publicKey = await crypto.subtle.importKey( "spki", pemToDer(publicKeyPem), // "PUBLIC KEY" -> spki, "PRIVATE KEY" -> pkcs8 { name: "ECDSA", namedCurve: "P-256" }, false, ["verify"], ); - 2.
Passer les JWK sous forme d’objets
Les points de terminaison JWKS fournissent déjà des objets ; analysez le texte JSON une seule fois et passez l’objet avec la courbe correspondante.
js const jwk = JSON.parse(jwkText); // an object, not the JSON string const key = await crypto.subtle.importKey("jwk", jwk, { name: "ECDSA", namedCurve: jwk.crv }, false, ["verify"]);