Mensaje de error
Invalid JWK EC key
Node.js crypto — TypeError, code ERR_CRYPTO_INVALID_JWK
Qué significa
createPublicKey/createPrivateKey con format: "jwk" rechazó el objeto JWK: faltan miembros obligatorios, las coordenadas no se pueden decodificar o el punto (x, y) no está realmente en la curva indicada. Node valida el punto al importarlo, así que una coordenada dañada o truncada se detecta aquí en lugar de dar lugar a una clave con la que ninguna firma se verifica. Las mismas comprobaciones se hacen tanto si la JWK viene de un endpoint JWKS como de un archivo de configuración o de otro servicio: el error señala al objeto, no al transporte.
Por qué ocurre
Coordenadas que no están en base64url
frecuenteLos miembros x/y/d de una JWK deben estar en base64url sin relleno (RFC 7518). Las cadenas hexadecimales y los enteros decimales no se decodifican en los 32 bytes que se esperan para P-256. Node es permisivo con una variante: el base64 estándar con + / y relleno = se importa sin quejas, mientras que los navegadores rechazan la misma JWK con un DataError; una clave que funciona en el servidor puede fallar igualmente en el cliente.
Coordenada truncada o dañada
frecuenteUna coordenada que perdió un carácter por el camino, o a la que se le cambió uno, describe otro número, y el punto sale de la curva. El clásico error del cero inicial —un codificador que escribe 31 bytes porque el primer byte era cero— es el único truncamiento que Node perdona: el número no cambia, así que la clave se importa. Los navegadores rechazan esa misma JWK («should be 32» bytes), y por eso merece la pena corregirlo de todos modos.
crv no coincide con el material de clave
ocasionalUna JWK marcada con crv: "P-256" que lleva coordenadas de secp256k1 o de P-384 (tras una edición manual o un copiar y pegar de una plantilla) no puede describir un punto de la curva declarada.
Cómo solucionarlo
- 1.
Validar la forma de la JWK antes de importarla
Comprueba los miembros y las longitudes decodificadas. Para P-256, tanto x como y deben decodificarse en exactamente 32 bytes cada una.
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.
Rellenar con ceros a la izquierda las coordenadas cortas
Si quien generó los valores quitó los ceros iniciales, restaura la longitud fija antes de construir 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.
Regenerar a partir de una fuente de confianza
Si las coordenadas no superan la validación y no eres tú quien construye la JWK, vuelve a descargarla del endpoint JWKS del emisor en lugar de reparar bytes: una JWK que necesita cirugía es una JWK en la que no deberías confiar.