日本語

開発者ツール · Base64 エンコーダーおよびデコーダー

PEM の説明: BEGIN と END の間で証明書とキーが Base64 である理由

· 背景

base64 エンコード

PEM アーマー: BEGIN ラベルと END ラベル、および DER バイナリの 64-column Base64 ラッピング
オリジナル ToolAcre ベクトル イラスト

PEM ファイルは、ラベル付きの Armor ラインを備えた Base64 でラップされた DER バイナリです。この投稿では、この形式の起源、その行規則、および形式を解読することで何が学べるのか、何が学べないのかについて説明します。

「テキストのように見える」が解析に失敗した証明書 - ヘッダーのタイプミス、改行、その下の形式

PEM ファイルは、テキスト ラベルでラップされた Base64 でエンコードされたバイナリです。この名前は、暗号化されたメッセージにこの形式を使用する Privacy-Enhanced Mail (RFC 1421、1992) に由来しています。この形式は現在、TLS 証明書、SSH キー、GPG キーとして存続しています。構造は単純です。-----BEGIN CERTIFICATE----- (または BEGIN PRIVATE KEY、BEGIN PUBLIC KEY など) という行の後に、base64 テキストの 64 文字行が続き、その後に -----END CERTIFICATE----- が続きます。

Base64 本体は、DER (Distinguished Encoding Rules) と呼ばれるバイナリ形式にデコードされます。これは、構造化データ (具体的には、ASN.1 構造) をシリアル化する方法です。 Base64 をデコードするとバイナリが得られます。バイナリを読み取るには、複雑な ASN.1 を理解する必要があります。 PEM アーマーが存在するのは、バイナリ ファイルを電子メールで送信したり編集したりすることが難しいためです。純粋なバイナリ形式の証明書ファイルは、古いメール システム、USENET、または Web フォームを通過すると破損します。

PEM ブロックに表示されるテキスト アーマー — Base64 ボディの周囲のラベル

バイナリを Base64 でエンコードし、テキスト ラベルでラップすることにより、証明書全体が、どのような転送にも耐えられる 7 ビットの ASCII テキストになります。テキストエディタで開くことができます。メール システムによって破損することはありません。 -----BEGIN 行と -----END 行は人間と自動ツールのラベルです。内部にどのような種類のデータが入っているかを明確にマークします。証明書には CERTIFICATE というラベルが付いています。秘密キーには PRIVATE KEY というラベルが付けられます。

ラベルは暗号化ソフトウェアによって検証されていません。それは人間とツールにとって単なるヒントです。 PEM の 64 文字行制限は、RFC 1421 と電子メールの Base64 と同じ MIME 理論に基づいています。古いメール システムには行長制限があり、64 文字は 1980 年代の端末に適合します。 PEM は、base64 出力を 64 文字で行末 (Windows では CR LF、Unix では LF) で折り返します。

ラベル付きテキストからデコードされたバイトまで - このリポジトリはフォーマット履歴を確立しません

PEM 証明書をデコードする場合、パーサーはアーマー行 (-----BEGIN...、-----END...) と改行を削除し、残りを Base64 デコードする必要があります。改行やラベルの不一致により、解析が中断される可能性があります。行の折り返しは Base64 標準の一部ではありません (RFC 4648 Base64 はラップされていません)。これは PEM に固有のものです。 Base64 の内部には、DER でエンコードされたバイナリが含まれます。 DER は ASN.1 (抽象構文表記法) であり、データ構造を表現するための複雑な仕様です。

証明書は、サブジェクト名、公開キー、署名、およびメタデータを含む構造化レコードです。 ASN.1 はバイトを直接記述しません。構造をエンコードする方法を説明します。

このツールへの入力としてのブロックの構造 — ラベルを削除し、Base64 本体のみを渡します

エンコードはタグ長値のトリプレットで始まります。たとえば、ASN.1 の SEQUENCE はタグ 0x30 としてエンコードされ、その後にコンテンツの長さが続き、その後にコンテンツ自体が続きます。証明書は常にバイト 0x30 0x82 (シーケンス、2 バイトでエンコードされた長さ) で始まり、base64 では MII として表示されます。

解析せずに証明書をチェックする: PEM 証明書本文の最初の 3 文字は、ほとんどの場合 MII (base64 では 0x30 0x82、SEQUENCE の始まり) です。 PEM ブロックが 0x30 にデコードされない場合は、base64 が破損しているか、ラベルが間違っています。 Base64 エンコーダおよびデコーダ ツールは、本文をデコードして 16 進数を表示できます。base64 行を貼り付け (-----BEGIN および END アーマーなしで)、改行を削除して、デコードします。

デコードによって明らかにされるもの: バイナリ バイト、解析されていない証明書フィールド

出力が 30 82 で始まるバイナリの場合、それは有効な証明書構造である可能性があります。内容が意味不明またはテキストの場合は、デコードが失敗したか、base64 が間違っています。一般的な PEM エラー: ラベルの不一致 (証明書本体に PRIVATE KEY ラベルが付いているなど)、Windows の行末の問題 (一部のパーサーが CRLF で停止する)、アーマー行のタイプミス (余分なスペースまたは文字)、または改行の欠落。

ツールは、-----BEGIN CERT----- や BEGIN CERTIFICATE ではなく、-----BEGIN CERTIFICATE----- を想定しています。 Web ブラウザーまたは PDF から PEM をコピーアンドペーストすると、ASCII 引用符の代わりに Unicode 引用符またはスマート引用符が導入され、ラベルが壊れる可能性があります。秘密キーを証明書フィールドに貼り付けるのはよくある間違いです。ラベルが一致しないため、パーサーはそれを拒否します。 PEM は 1 つのファイル内の複数のブロックをサポートします。

実用的な例: 短い本文をデコードし、証明書の署名をアサートせずにバイトを検査する

SSH 鍵ファイルには、秘密鍵 (PRIVATE KEY というラベル) と公開鍵 (PUBLIC KEY というラベル) の両方、または複数の証明書ブロックが含まれる場合があります。パーサーはファイルを先頭から読み取り、-----BEGIN で始まる行を探します。見つかった場合は、一致するラベルを持つ -----END まで読み取り、本文を抽出して Base64 デコードして、処理します。その後、次のブロックの検索を続けます。

1 つのファイル内で誤って連結された証明書チェーン (証明書とその中間物の複数の PEM ブロック) は、すべてのラベルが正しければ有効です。 PEM 形式は、1990 年代初頭にプライバシー強化メール (RFC 1421) 用に標準化されました。

これでカバーされないもの — ASN.1 構造の解析、秘密キー暗号化、および PKCS#12 バンドル

RFC 7468 (2015) は定義を最新化し、線の長さのルール、装甲線の形式、および特殊なケースを明確にしました。現在、ほとんどのツールと標準は RFC 7468 を参照しています。他のバイナリからテキストへの形式 (一部のプロトコルの DER から 16 進数など) も存在しますが、base64 および ASCII ラベルを備えた PEM は、人間が判読可能でプレーン テキストであり、コピーや送信が簡単であるため、暗号化と TLS の事実上の標準です。

PEM ブロックの構築: DER バイナリ (暗号ライブラリからの証明書など) を取得し、base64 にエンコードし、結果を 64 文字で改行してラップし、-----BEGIN CERTIFICATE----- および -----END CERTIFICATE----- 行で囲みます。 PEM ブロックの解析: -----BEGIN および -----END 行を見つけ、base64 本文を抽出し (アーマーと改行を削除)、base64 デコードしてバイナリを取得し、DER および ASN.1 バイナリを解析します。

要点: PEM はラベル付きの Base64 です — Base64 エンコーダーとデコーダーがブロックの Base64 本体を完全にブラウザー内で試すためのローカルな場所をどのように提供するか

ほとんどのツールはこれを自動化します。 PEM を手動で構築することはほとんどありません。ただし、構造を理解すると、解析エラーをデバッグするときや証明書を手動で検証するときに役立ちます。 PEM 証明書はテキストのように見えますが、内容はバイナリ データです。開始ラベルと終了ラベルを読んでも、証明書に何が含まれているかはわかりません。サブジェクト名、公開キー、発行者、有効期限を確認するには、base64 をデコードし、ASN.1 を解析する必要があります。

Base64 エンコーダおよびデコーダ ツールは本文をデコードできるため、最初の数バイトを検査できます。完全な解析を行うには、ASN.1 パーサーが必要です (ほとんどのプログラミング言語にはこれ用のライブラリがあります)。重要な洞察は、PEM がコンテナ形式であるということです。PEM には、証明書だけでなく、DER でエンコードされたデータがすべて保持されます。ラベルは使用目的を示しますが、パーサーはデータ型を正しく処理する必要があります。