Saltar al contenido
ecdsa.com
Node.js cryptocrypto de Node.js

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

Cómo solucionarlo

  1. 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. 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. 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.

Errores relacionados

Explorar toda la base de datos de errores de firma