Message d’erreur
Invalid JWK EC key
Node.js crypto — TypeError, code ERR_CRYPTO_INVALID_JWK
Ce que cela signifie
createPublicKey/createPrivateKey avec format: "jwk" a rejeté l’objet JWK : des membres obligatoires manquent, les coordonnées ne se décodent pas, ou le point (x, y) n’est pas réellement sur la courbe nommée. Node valide le point à l’import, si bien qu’une coordonnée corrompue ou tronquée est détectée ici au lieu de produire une clé qui ne vérifie jamais rien. Les mêmes contrôles s’appliquent, que la JWK provienne d’un point de terminaison JWKS, d’un fichier de configuration ou d’un autre service : l’erreur met en cause l’objet, pas le transport.
Pourquoi cela se produit
Coordonnées qui ne sont pas en base64url
fréquenteLes membres x/y/d d’une JWK doivent être en base64url sans remplissage (RFC 7518). Une fois décodés, les chaînes hexadécimales et les entiers décimaux ne donnent pas les 32 octets attendus pour P-256. Node tolère une variante : le base64 standard avec + / et le remplissage = s’importe sans protestation, alors que les navigateurs rejettent la même JWK avec une DataError ; une clé qui fonctionne sur le serveur peut donc tout de même échouer côté client.
Coordonnée tronquée ou corrompue
fréquenteUne coordonnée qui a perdu un caractère en transit, ou dont un caractère a été modifié, décrit un autre nombre, et le point sort de la courbe. Le bogue classique du zéro initial (un encodeur qui écrit 31 octets parce que le premier octet était nul) est la seule troncature que Node pardonne : le nombre est inchangé, donc la clé s’importe. Les navigateurs rejettent la même JWK (« should be 32 » octets), c’est pourquoi il vaut quand même la peine de le corriger.
crv ne correspond pas aux données de la clé
occasionnelleUne JWK estampillée crv: "P-256" mais portant des coordonnées secp256k1 ou P-384 (après une modification manuelle ou un copier-coller de modèle) ne peut pas décrire un point de la courbe déclarée.
Comment corriger l’erreur
- 1.
Valider la forme de la JWK avant l’import
Contrôlez les membres et les longueurs après décodage. Pour P-256, x et y doivent chacun se décoder en exactement 32 octets.
js const x = Buffer.from(jwk.x, "base64url"); const y = Buffer.from(jwk.y, "base64url"); console.log(jwk.kty, jwk.crv, x.length, y.length); // EC P-256 32 32 - 2.
Compléter à gauche les coordonnées trop courtes
Si un producteur a supprimé les zéros initiaux, rétablissez la longueur fixe avant de construire la JWK.
js const pad32 = (b) => Buffer.concat([Buffer.alloc(32 - b.length), b]); jwk.x = pad32(Buffer.from(jwk.x, "base64url")).toString("base64url"); jwk.y = pad32(Buffer.from(jwk.y, "base64url")).toString("base64url"); const key = crypto.createPublicKey({ key: jwk, format: "jwk" }); - 3.
Régénérer depuis une source de confiance
Si les coordonnées échouent à la validation et que vous n’avez pas construit la JWK vous-même, récupérez-la à nouveau depuis le point de terminaison JWKS de l’émetteur plutôt que de réparer les octets : une JWK qui a besoin de chirurgie est une JWK à laquelle vous ne devriez pas faire confiance.