エラーメッセージ
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)は関連する別のエラーで、タグと長さのヘッダー自体が揃う前に入力が終わっている場合に発生します。空のファイルや 1 バイトしかないファイル、長さの途中で切れたヘッダーなどです。
このエラーの意味
DER パーサーが ASN.1 のタグと長さのヘッダーであるはずの部分を読み取ったところ、実際にあるデータ量を超える長さが得られました。これは「このバイト列は DER ではない」ことを示す典型的な兆候です。通常、入力は微妙に壊れた構造ではなく、生の DER としてパースされている base64 テキスト、PEM、または途中で切れたデータです。
発生する理由
バイナリ DER としてパースされた Base64/PEM テキスト
よくあるASCII 文字をタグや長さのバイトとして解釈すると、すぐにありえない長さになります。ファイルが PEM なのに -inform der を指定する(または base64 をデコードせずにパイプで渡す)のが、典型的な原因です。
途中で切れた DER
よくあるダウンロードの中断、データベースの列の長さ制限、コピーと貼り付けの際の末尾バイトの欠落などがあると、ヘッダーが実際より多くの内容を示す状態になります。外側の SEQUENCE の長さがファイルサイズと一致しなくなります。
連結されたデータ、または位置がずれたデータ
ときどき本来の構造の前に余分なバイト(ファイルに保存された HTTP ヘッダーや、別のプロトコルのフレーミングなど)があると、パーサーの読み取り位置がずれ、不正なヘッダーと解釈されるバイトを読むことになります。バイトの内容に応じて、このエラーか、関連する別のエラー「header too long」として報告されます。短い長さプレフィックスが付いている場合は、エラーにならないまま誤ってパースされることもあり、そのとき asn1parse は失敗せずに意味のない 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.
パースする前にサイズを確認する
ECDSA P-256 の DER 署名なら、0x30 で始まる約 70〜72 バイトになるはずです。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 を表示します。バイト列を貼り付けて、実際にどちらの形式なのかを確認してください。