错误信息
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 或被截断的数据,而不是结构上有什么细微损坏。
原因
把 Base64/PEM 文本当作二进制 DER 解析
常见ASCII 字符被当作标签/长度字节解读,会立刻得出荒谬的长度值。文件是 PEM 却传入了 -inform der(或者未经解码就通过管道传入 base64),是最典型的触发方式。
被截断的 DER
常见下载中途中断、数据库列长度限制,或者复制粘贴时丢失了末尾字节,都会导致头部声明的内容长度超过实际存在的内容。外层 SEQUENCE 的长度与文件大小不再一致。
数据被拼接或发生偏移
偶见真正的结构之前多出了字节——例如被一起保存进文件的 HTTP 头部、另一种协议的帧封装——会让解析器错位,读到被解读为无效头部的字节;视具体字节而定,报告的是这个错误或同类的“header too long”。较短的长度前缀也可能被悄无声息地错误解析:此时 asn1parse 不会报错,而是打印出毫无意义的第一行。
修复方法
- 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.
解析前先检查大小
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.
如果是原始 r‖s 签名,先转换格式
JWS 和 WebCrypto 生成的是 64 字节的原始 ECDSA 签名,任何 DER 解析器都不会接受。下方的转换器可以把原始格式转换为 DER(也可反向转换),并显示 r 和 s 两个整数——粘贴这些字节,就能看出你手里的究竟是哪种格式。