Message d’erreur
Invalid key object type public, expected private.
Les deux noms varient selon la clé et l’opération : sign() avec une clé secrète signale « Invalid key object type secret, expected private. », verify() avec une clé secrète « Invalid key object type secret, expected private or public. » La fonction verify() accepte d’ailleurs une clé privée et effectue le contrôle avec sa moitié publique. La structure du message est stable.
Node.js crypto — TypeError, code ERR_CRYPTO_INVALID_KEY_OBJECT_TYPE
Ce que cela signifie
Vous avez passé un KeyObject de la mauvaise classe pour l’opération : crypto.sign() a besoin d’une clé privée mais a reçu une clé publique (ou verify() a reçu une clé secrète, etc.). Les objets de clé de Node connaissent leur propre type (public, privé ou secret), et chaque API n’accepte que certains types.
Pourquoi cela se produit
Variables interverties au point d’appel
fréquentepublicKey et privateKey échangées lors d’une déstructuration, ou un paramètre de fonction nommé key qui reçoit ce que l’appelant avait sous la main. Signer avec la clé publique est impossible par construction, et Node le dit au lieu d’échouer mystérieusement plus tard.
Le chargement a produit un autre type que celui supposé
fréquentecreatePublicKey(privatePem) dérive volontairement une clé publique : le code qui traite ensuite le résultat comme une clé privée pour signer échoue ici. De même, un fichier PEM qui contient en réalité une clé publique se charge avec le type « public », quel que soit le nom du fichier.
Clé secrète (symétrique) dans une API asymétrique
occasionnelleLe résultat de createSecretKey() (une clé HMAC/AES) passé à sign/verify pour ECDSA. Une clé symétrique ne peut pas participer à des signatures à clé publique.
Comment corriger l’erreur
- 1.
Contrôler le type de clé au point d’entrée
KeyObject.type vaut "public" | "private" | "secret". Une assertion d’une ligne transforme, dès le chargement, une erreur cryptographique déroutante en une erreur évidente.
js import { createPrivateKey } from "node:crypto"; const signingKey = createPrivateKey(pem); if (signingKey.type !== "private") { throw new Error(`expected private key, got ${signingKey.type}`); } - 2.
Utiliser chaque moitié de la paire pour sa propre opération
La clé privée signe, la clé publique vérifie. Si vous ne détenez qu’une clé privée, dérivez-en la moitié publique pour la vérification au lieu de réutiliser l’objet privé partout.
js import { createPublicKey, sign, verify } from "node:crypto"; const signature = sign("sha256", data, privateKey); // private → sign const publicKey = createPublicKey(privateKey); // derive public half const ok = verify("sha256", data, publicKey, signature); // public → verify