PHPカンファレンス香川2026
レギュラートーク (30分)
PHPの話

PHPでバイナリをパースして理解するASN.1

muno_92 muno92 muno_92
4

皆さん、ASN.1をご存知ですか?

ASN.1とはX.509証明書や電子署名などのデータ形式の定義に使われている抽象構文記法(Abstract Syntax Notation)です。
ASN.1で定義されたデータはPEM/DERなどの形式でエンコードされます。

証明書や秘密鍵などを作成する際のファイル形式としてPEMやDERといった文字を見たことがある方も多いのではないでしょうか。

「DERはバイナリ形式、PEMはそれをBase64エンコードしたテキスト形式」と説明されることもありますが、ではDERのバイナリデータがどのような形式になっているのか説明できますか?

私は最近「電子署名から内部に記載された情報(署名に使われた証明書の発行者情報や有効期限)を取り出したいな」「仕様を読めばライブラリなどを使わなくても独自実装でパースできるのでは」と思い、調べている内にASN.1の存在を知りました。

ASN.1のデータ定義とそれがどのようにエンコードされるかを理解すればバイナリから欲しい情報を取り出せるようになります。

このトークでは証明書からシリアル番号や発行者情報・有効期限などを取り出す実装を例とし、以下について発表します。

  • ASN.1やそのエンコード方法(BER/DER)
  • それを踏まえたBER/DER形式のデコードのPHPでの実装例
    • PHPでのバイナリのパース方法
    • バイト列の読み取り・管理
    • ビット演算を用いた特定ビットの判別や複数バイトで構成される値の読み取り

身近にある存在の仕組みを少し深堀りしてみると面白い世界が広がっています。

この発表を通して、色々な仕様に使われているASN.1の面白さ(とややこしさ)に触れてみましょう。