跳到主要内容
ecdsa.com
OpenSSL 3.xOpenSSL CLI

错误信息

error:0480006C:PEM routines::no start line

在 Node 26(OpenSSL 3.5)上用 X509Certificate 和 tls.createSecureContext() 复现。OpenSSL 1.1.1 把同样的失败打印为“error:0909006C:PEM routines:get_name:no start line”,OpenSSL 1.1.0 则打印为“error:0906D06C:PEM routines:PEM_read_bio:no start line”。与之相关的另一个错误是“error:04800066:PEM routines::bad end line”,出现在 END 标记损坏时。

OpenSSL 3.x — also surfaces in Node as ERR_OSSL_PEM_NO_START_LINE

含义

PEM 解析器在输入中查找与它所需对象相匹配的“-----BEGIN ...-----”行,但一行也没有找到。原因要么是文件根本不是 PEM(而是二进制 DER、JSON 或空文件),要么是 BEGIN 标签指明的对象与解析器需要的不同,要么是封装结构在传递过程中被破坏了。

原因

修复方法

  1. 1.

    查看开头的几个字节

    一行 xxd 输出就能区分 PEM(ASCII 短横线)、DER(首字节为 0x30)和无效数据。然后据此转换或修复。

    bash
    head -c 32 file | xxd
    # 2d 2d 2d 2d 2d ("-----")  → PEM: check the label matches what the tool expects
    # 30 82 ...                  → DER: add -inform der or convert:
    openssl x509 -inform der -in cert.der -out cert.pem
  2. 2.

    修复在传输中损坏的 PEM

    恢复换行符,并去掉 BOM/CR。修复后,BEGIN 行必须恰好由五个短横线、标签和五个短横线组成。

    bash
    printf '%s' "$PEM_VAR" | sed 's/\\n/\n/g' | sed '1s/^\xef\xbb\xbf//' | tr -d '\r' > fixed.pem
    head -1 fixed.pem   # -----BEGIN CERTIFICATE-----
  3. 3.

    在 Node 中,先规范化再解析

    同一错误在 X509Certificate 和 tls.createSecureContext() 的 cert 选项中表现为错误码 ERR_OSSL_PEM_NO_START_LINE;修复环境变量中的换行符就能解决大多数情况。密钥加载函数(createPublicKey、createPrivateKey)则会把无法解析的输入报告为“error:1E08010C:DECODER routines::unsupported”。

    js
    import { X509Certificate } from "node:crypto";
    const cert = new X509Certificate(process.env.CERT_PEM.replace(/\\n/g, "\n"));

相关错误

浏览完整的签名错误库