6.

PEM (.pem) とは ― Base64 テキストで証明書・秘密鍵を扱う事実上の標準形式

編集
この記事の要点
  • PEM (.pem)Base64 + ヘッダ・フッタで構成されたテキスト形式の暗号材料
  • -----BEGIN CERTIFICATE----- / -----END CERTIFICATE----- のような区切りで複数オブジェクトを連結可能
  • 証明書 / 秘密鍵 / 公開鍵 / CSR / CRL すべて PEM で表現可能
  • nginx / Apache / HAProxy / Envoy の TLS 設定で事実上の標準
  • openssl x509 -in cert.pem -text -noout で内容確認、openssl rsa / openssl pkey で形式変換

要点

  • PEM (Privacy-Enhanced Mail) は、X.509 証明書や秘密鍵などを Base64 テキストで表現する汎用フォーマット。
  • ファイルの中身は -----BEGIN CERTIFICATE----------END CERTIFICATE----- のように、ヘッダ行とフッタ行で囲まれている。
  • 1 ファイルに 複数の証明書を連結でき、証明書チェーン (サーバ証明書 + 中間 CA + ルート CA) の配布に便利。
  • 拡張子は .pem のほか .crt / .cer / .key でも実体が PEM のことが多い。

概要

PEM は元々 1993 年の RFC 1421〜1424 で定義された電子メール暗号化規格に由来するフォーマットで、現在はメール用途よりも TLS / SSL 証明書、SSH 鍵、CSR (証明書署名要求)、秘密鍵の保存形式として広く使われている。バイナリ DER データを Base64 にエンコードし、その前後を -----BEGIN X----- / -----END X----- という ASCII 行で挟むだけのシンプルな構造で、人間がエディタで開いても文字化けせず、メールやチケットに貼り付けて受け渡せる点が大きな利点である。

HTTPS サーバ (Apache / nginx)、Postfix / Dovecot、HAProxy、curl、OpenSSL、Python requests、Java keytool (importcert) など、ほぼあらゆる暗号関連ソフトが入出力対応している事実上の標準形式といえる。

内部構造

PEM ファイルは「ラベル行 + Base64 本体 + ラベル行」の繰り返しで構成される。代表的なラベルには以下がある。

  • CERTIFICATE: X.509 証明書
  • PRIVATE KEY / RSA PRIVATE KEY / EC PRIVATE KEY: 秘密鍵
  • PUBLIC KEY: 公開鍵
  • CERTIFICATE REQUEST: CSR
  • DH PARAMETERS: DH パラメータ
  • X509 CRL: 失効リスト

Base64 本体は 1 行 64 文字に折り返されるのが伝統的なスタイル。中身を Base64 デコードすると DER (ASN.1 バイナリ) が現れる、つまり「PEM = Base64(DER) + ラベル行」という関係である。

-----BEGIN CERTIFICATE-----
MIIDdzCCAl+gAwIBAgIEbW9rdTANBgkqhkiG9w0BAQsFADBfMQswCQYDVQQGEwJK
... (Base64 が続く) ...
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
MIID...   (中間 CA など、連結して書ける)
-----END CERTIFICATE-----

主な用途

  • HTTPS サーバ証明書の配置: nginx の ssl_certificate、Apache の SSLCertificateFile はいずれも PEM。
  • 証明書チェーンの配布: 1 つの fullchain.pem にサーバ証明書 + 中間 CA を連結 (Let's Encrypt の標準スタイル)。
  • クライアント証明書認証: curl の --cert / --key や requests の cert= 引数に PEM パスを渡す。
  • SSH 公開鍵 / 秘密鍵: OpenSSH も内部表現は PEM 派生 (BEGIN OPENSSH PRIVATE KEY ラベル)。

関連形式との比較

  • DER: PEM をデコードしたバイナリそのもの。サイズはやや小さいが目視不可。Java や Windows 一部 API が直接読む。
  • PFX / P12: 証明書 + 秘密鍵をパスワード暗号化して 1 ファイル化。Windows / IIS / Authenticode 系で多用。PEM はパスワード保護なし or PEM 内 ENCRYPTED PRIVATE KEY で保護。
  • JKS / PKCS12 (Java): Java 専用キーストア。keytool で PEM からインポート可能。

コマンド・ツール

# 証明書の内容を人間可読に表示
openssl x509 -in cert.pem -noout -text

# PEM → DER
openssl x509 -in cert.pem -outform der -out cert.der

# DER → PEM
openssl x509 -inform der -in cert.der -out cert.pem

# fullchain (サーバ + 中間) を連結
cat server.pem intermediate.pem > fullchain.pem

# 有効期限だけ確認
openssl x509 -in cert.pem -noout -enddate

# 秘密鍵と証明書の一致確認 (modulus 比較)
openssl x509 -in cert.pem -noout -modulus | openssl md5
openssl rsa  -in key.pem  -noout -modulus | openssl md5

Wireshark や Apache mod_ssl もデバッグログに PEM ブロックを書き出すことがあり、テキストでそのまま扱えるのは運用上きわめて便利。

注意点

  • 秘密鍵を含む PEM の取り扱い: BEGIN PRIVATE KEY を含むファイルは平文の鍵そのもの。Git にコミットしない、chmod 600 必須。
  • 改行コード: CRLF と LF の混在で一部 (古い) ツールがエラーを出す。Unix 環境では LF に統一する。
  • ファイル末尾の改行: 最終 -----END----- 行の後に改行が無いと一部ライブラリがパース失敗する。
  • チェーン順序: 多くのサーバは「サーバ証明書 → 中間 CA → (ルート)」順を期待。逆順だとブラウザでチェーン不完全になる。
  • パスフレーズ保護鍵: BEGIN ENCRYPTED PRIVATE KEY は起動時にパスフレーズ要求が必要。自動起動サービスでは別の鍵管理 (Vault, KMS) を推奨。

関連リンク

編集
Post Share
子ページ

子ページはありません

同階層のページ
  1. ISO(.iso)
  2. IMG(.img)
  3. VHD / VHDX(.vhd / .vhdx)
  4. QCOW2(.qcow2)
  5. OVA / OVF(.ova / .ovf)
  6. PEM(.pem)
  7. CRT / CER / DER(.crt / .cer / .der)
  8. PFX / P12(.pfx / .p12)
  9. PCAP / PCAPNG(.pcap / .pcapng)
  10. DMP / コアダンプ(.dmp / .core)

最近更新/作成されたページ