错误信息
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”一词,但这几乎从来不是缺少某种算法的问题——它的意思是,在解码器尝试过的所有格式中,这些字节都不是可读的密钥。
原因
环境变量中的 PEM 带有字面量 \n
常见机密管理工具和 .env 文件给出的内容常常是“-----BEGIN PRIVATE KEY-----\nMIG...”,其中的反斜杠 n 是两个字符。OpenSSL 看到的是只有一行的文件,找不到有效的 PEM 封装结构,于是放弃解析。
空字符串或非密钥内容
常见变量中存的是 ""、文件路径(而不是文件内容)、一段 JSON,或者在需要原始密钥的地方放了证书。任何不是 PEM/DER 密钥材料的内容,触发的都正是这个错误。
密钥类型与 API 不符
常见把公钥 PEM 传给 createPrivateKey() 就会报出这条消息——解码器要找的是私钥结构,却什么也没找到。反过来则不会出错:createPublicKey() 接受私钥,并从中推导出公钥部分。
没有格式元数据的 DER 字节
偶见以裸 Buffer 传入的原始 DER 默认会按 PEM 解析。没有 { format: "der", type: "pkcs8" | "spki" | "sec1" },解码器就无从得知该按哪种结构解析。
修复方法
- 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.
明确声明 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.
在 Node 之外验证密钥材料
让 OpenSSL 告诉你这些字节究竟是什么。如果这一步也失败,说明数据本身已损坏——要修复的是数据来源,而不是 Node 调用。
bash openssl pkey -in key.pem -noout -text | head # for DER: openssl pkey -in key.der -inform der -noout -text | head