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

Mensaje de error

Invalid key object type public, expected private.

Los dos sustantivos cambian según la clave y la operación: sign() con una clave secreta da «Invalid key object type secret, expected private.», y verify() con una clave secreta, «Invalid key object type secret, expected private or public.». verify() en sí acepta una clave privada y verifica con su mitad pública. La estructura del mensaje es estable.

Node.js crypto — TypeError, code ERR_CRYPTO_INVALID_KEY_OBJECT_TYPE

Qué significa

Se pasó un KeyObject de una clase incorrecta para la operación: crypto.sign() necesita una clave privada pero recibió una pública (o verify() recibió una clave secreta, etc.). Los objetos de clave de Node conocen su propio tipo —pública, privada o secreta— y cada API solo acepta tipos concretos.

Por qué ocurre

Cómo solucionarlo

  1. 1.

    Comprobar los tipos de clave en el punto de entrada

    KeyObject.type es "public" | "private" | "secret". Una aserción de una línea convierte un error criptográfico confuso en uno evidente en el momento de la carga.

    js
    import { createPrivateKey } from "node:crypto";
    
    const signingKey = createPrivateKey(pem);
    if (signingKey.type !== "private") {
      throw new Error(`expected private key, got ${signingKey.type}`);
    }
  2. 2.

    Usar cada mitad del par para su propia operación

    La privada firma, la pública verifica. Si solo tienes una clave privada, deriva de ella la mitad pública para la verificación en lugar de reutilizar el objeto privado en todas partes.

    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

Errores relacionados

Explorar toda la base de datos de errores de firma