跳到主要内容
ecdsa.com
Node.js cryptoNode.js crypto 模块

错误信息

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 的密钥对象知道自己的类型——公钥(public)、私钥(private)或对称密钥(secret)——每个 API 只接受特定的类型。

原因

修复方法

  1. 1.

    在边界处断言密钥类型

    KeyObject.type 的取值为 "public" | "private" | "secret"。一行断言就能把令人困惑的 crypto 错误,变成加载时一眼就能看懂的错误。

    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

相关错误

浏览完整的签名错误库