跳到主要内容
ecdsa.com
Node.js crypto (OpenSSL 3)Node.js crypto 模块

错误信息

error:1E08010C:DECODER routines::unsupported

在 Node 26 / OpenSSL 3.x 上复现。OpenSSL CLI 打印的是完整形式:“error:1E08010C:DECODER routines:OSSL_DECODER_from_bio:unsupported”。在 Node ≤16(OpenSSL 1.1.1)上,同样的错误用法会产生不同的消息。

Node.js crypto (OpenSSL 3) — code ERR_OSSL_UNSUPPORTED

含义

OpenSSL 3 的解码器无法解析你传给 createPrivateKey()、createPublicKey()、sign() 或 verify() 的密钥材料。尽管错误中有“unsupported”一词,但这几乎从来不是缺少某种算法的问题——它的意思是,在解码器尝试过的所有格式中,这些字节都不是可读的密钥。

原因

修复方法

  1. 1.

    规范化来自环境变量的 PEM 并检查标签

    恢复换行符并打印第一行。如果在调用 createPrivateKey 的地方,标签写的却是 PUBLIC KEY,说明这个变量接错了密钥。

    js
    const pem = process.env.SIGNING_KEY.replace(/\\n/g, "\n");
    console.log(pem.split("\n")[0]);
    // -----BEGIN PRIVATE KEY-----      → createPrivateKey(pem)
    // -----BEGIN PUBLIC KEY-----       → createPublicKey(pem)
    // -----BEGIN EC PRIVATE KEY-----   → createPrivateKey(pem)  (SEC1, also fine)
  2. 2.

    明确声明 DER

    如果密钥是二进制 DER(来自数据库 blob、JWKS 转换或 protobuf),就要声明格式和类型;解码器不会去猜。

    js
    import { createPrivateKey } from "node:crypto";
    
    const key = createPrivateKey({
      key: derBuffer,
      format: "der",
      type: "pkcs8",   // or "sec1" for BEGIN EC PRIVATE KEY material
    });
  3. 3.

    在 Node 之外验证密钥材料

    让 OpenSSL 告诉你这些字节究竟是什么。如果这一步也失败,说明数据本身已损坏——要修复的是数据来源,而不是 Node 调用。

    bash
    openssl pkey -in key.pem -noout -text | head
    # for DER:
    openssl pkey -in key.der -inform der -noout -text | head

相关错误

浏览完整的签名错误库