PEM ファイルとは?解説
PEM ファイルは、暗号データ、つまり鍵や証明書を、人間が読める BEGIN と END のマーカーの間に base64 として包むテキストコンテナです。
PEM は、鍵や証明書のファイルを開くときにほぼ必ず目にする形式です。ダッシュの行と「BEGIN CERTIFICATE」で始まるあのブロックが PEM です。PEM はプレーンテキストなので設定ファイルや secret を通じて簡単に移動でき、まさにそれが CI パイプラインが TLS 証明書、署名鍵、アプリの資格情報にそれを頼る理由です。
PEM ファイルとは何か
PEM(Privacy Enhanced Mail、その起源に由来する名前)は、バイナリの暗号データを取り、base64 エンコードし、何を含むかを示すヘッダー行とフッター行の間に包むテキストエンコーディングです。下層のバイナリは通常 DER エンコードされており、PEM はそれをテキストセーフにするだけです。
BEGIN と END のマーカー
各 PEM ブロックは、内容、つまり証明書、公開鍵、秘密鍵を名付ける BEGIN と END のマーカーのような行で区切られます。単一の .pem ファイルは複数のブロックを保持でき、たとえば証明書に続いてそのチェーンを含められます。マーカーはツールに各ブロックの解釈方法を伝えます。
PEM ファイルが保持するもの
PEM は 1 つの特定のものではなくコンテナです。TLS 証明書、証明書チェーン、公開鍵、秘密鍵を保持できます。それらを区別するのはマーカーのテキストです。だからこそ単一の PEM 取り扱いの習慣が、多くの CI 資格情報のシナリオをカバーします。
CI における PEM ファイル
一般的なパターンは、PEM 資格情報、たとえば GitHub App の秘密鍵や TLS クライアント証明書を CI secret として保存し、それをツールが消費できるよう job 内でファイルに書き戻すことです。PEM はテキストなので secret としてきれいに保存されますが、その改行を保持することが重要で、さもないとツールが拒否します。
# Restore a PEM private key from a secret in CI
steps:
- run: |
printf "%s" "${{ secrets.APP_PRIVATE_KEY }}" > app.pem
chmod 600 app.pemLatchkey に関する注記
PEM の secret は、GitHub ホスト runner と同様に Latchkey runner でもログ内でマスクされます。制限的なパーミッションで PEM 鍵を job 内のファイルに書き込むことが、それを露出させずに CLI へ渡す標準的な方法です。
重要なポイント
- PEM ファイルは、base64 の暗号データを BEGIN と END のマーカーの間に包むテキストコンテナです。
- 証明書、証明書チェーン、公開鍵、秘密鍵を保持でき、どれかはマーカーが示します。
- CI は PEM 資格情報をテキストの secret として保存し、ツールが使えるようファイルへ書き戻します。