Перейти к содержимому
ecdsa.com
Node.js cryptoМодуль crypto в Node.js

Сообщение об ошибке

Invalid key object type public, expected private.

Два названия типа в сообщении меняются в зависимости от ключа и операции: sign() с секретным ключом выдаёт «Invalid key object type secret, expected private.», а verify() с секретным ключом — «Invalid key object type secret, expected private or public.» Сам verify() принимает закрытый ключ и выполняет проверку его открытой половиной. Структура сообщения не меняется.

Node.js crypto — TypeError, code ERR_CRYPTO_INVALID_KEY_OBJECT_TYPE

Что это означает

Вы передали KeyObject не того класса для этой операции: crypto.sign() требуется закрытый ключ, а ему передали открытый (или verify() передали секретный ключ и т. п.). Объекты ключей в Node знают свой тип (открытый, закрытый или секретный), и каждый API принимает только определённые типы.

Почему это происходит

Как исправить

  1. 1.

    Проверяйте тип ключа на входе

    KeyObject.type принимает значения "public" | "private" | "secret". Однострочная проверка превращает запутанную криптографическую ошибку в очевидную ещё на этапе загрузки.

    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.

    Используйте каждую половину пары для своей операции

    Закрытый ключ подписывает, открытый проверяет. Если у вас есть только закрытый ключ, выведите из него открытую половину для проверки, а не используйте объект закрытого ключа везде.

    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

Связанные ошибки

Открыть всю базу ошибок подписей