本文へスキップ
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)は関連する別のエラーで、タグと長さのヘッダー自体が揃う前に入力が終わっている場合に発生します。空のファイルや 1 バイトしかないファイル、長さの途中で切れたヘッダーなどです。

このエラーの意味

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 署名なら、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. 3.

    生の r‖s 署名なら変換する

    JWS と WebCrypto は 64 バイトの生の ECDSA 署名を出力しますが、DER パーサーはどれもこれを受け付けません。下の変換ツールは生の署名を DER に(逆方向にも)変換し、整数 r と s を表示します。バイト列を貼り付けて、実際にどちらの形式なのかを確認してください。

関連するエラー

署名エラーデータベースをすべて見る