跳到主要内容
ecdsa.com
OpenSSL 3.x CLI (asn1parse, d2i loaders)OpenSSL CLI

错误信息

error:0680009B:asn1 encoding routines:ASN1_get_object:too long

在 OpenSSL 3.6 上复现;OpenSSL 1.1.x 会把同一失败打印为“error:0D07209B:asn1 encoding routines:ASN1_get_object:too long”。被广泛搜索的“header too long”(OpenSSL 3 上为 error:0680007B,1.1.x 上为 error:0D07207B)是它的同类错误:输入在标签和长度头部本身完整之前就结束了——例如空文件或单字节文件,或者头部在长度字段中间被截断。

含义

DER 解析器在本应是 ASN.1 标签-长度头部的位置读到了一个超出可用数据量的长度——这是“这些字节不是 DER”的典型特征。通常问题在于输入是被当作原始 DER 解析的 base64 文本、PEM 或被截断的数据,而不是结构上有什么细微损坏。

原因

修复方法

  1. 1.

    让输入格式与解析器匹配

    先解码 base64,或者告诉工具输入是 PEM。asn1parse 默认输入为 PEM;-inform der 只用于真正的二进制数据。

    bash
    # base64 signature/blob → DER, then parse
    openssl base64 -d -in sig.b64 | openssl asn1parse -inform der
    
    # PEM object: let asn1parse handle the armor itself
    openssl asn1parse -in cert.pem
  2. 2.

    解析前先检查大小

    ECDSA P-256 的 DER 签名应约为 70~72 字节,并以 0x30 开头。96 字节的“签名”很可能是 base64;64 字节则是原始 r‖s,根本不是 DER。

    bash
    wc -c < sig.der
    head -c 8 sig.der | xxd   # 30 44/45/46 ... → DER SEQUENCE
  3. 3.

    如果是原始 r‖s 签名,先转换格式

    JWS 和 WebCrypto 生成的是 64 字节的原始 ECDSA 签名,任何 DER 解析器都不会接受。下方的转换器可以把原始格式转换为 DER(也可反向转换),并显示 r 和 s 两个整数——粘贴这些字节,就能看出你手里的究竟是哪种格式。

相关错误

浏览完整的签名错误库