| この記事の要点 |
|
概要
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: CSRDH 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) を推奨。
関連リンク
子ページ
子ページはありません
人気ページ
- 1 Eclipseで「サーバーに追加または除去できるリソースがありません。」の原因と対処法
- 2 tomcat の起動 / 停止ログと catalina.log・catalina.out の違い
- 3 JavaScript で base URL を取得する方法|window.location.origin
- 4 YouTube Data API v3 エラー一覧|403・400・404 の原因と対処
- 5 Laravel エラー一覧|500/Blade/DB 接続/ルーティングの代表エラー
- 6 3Dグラフィックスとは|モデリング/レンダリング/主要ソフトウェア (Blender / Maya)
- 7 Spring Frameworkのアノテーション一覧
- 8 【Spring】@Valueアノテーションとは
- 9 CATALINA_HOME の確認方法 (Linux / Mac)
- 10 【Spring】@Autowiredアノテーションとは
最近更新/作成されたページ
- Git pushした変更の取消し|revert・履歴変更と保護の注意点 2026-10-15 23:49:01
- Gitでローカルを戻す前に|reset・restoreの違いと退避範囲 2026-10-15 23:49:01
- Git rebaseの使い方|対象範囲・競合解決・pushの判断 2026-10-15 22:50:59
- Git pullの使い方|取込み先・ff-only・競合とstashの注意点 2026-10-15 22:50:59
- Git pushの使い方|送信先・タグ・force-with-leaseの条件 2026-10-15 22:12:47
- Git remoteの設定・確認・削除|SSH URLとfetch/pushの違い 2026-10-15 22:12:47
- Gitリモートリポジトリの作成|初回push・既存履歴・mirrorの注意 2026-10-15 15:48:16
- Gitのuser.name・user.email設定|local/global・確認と過去履歴の注意 2026-10-15 15:30:07
- LinuxにGitをインストール|配布元・初期設定・TLSと認証の確認 2026-10-15 15:30:06
- Git導入と初回push|Linuxサーバー・Windows/macOS・SSH設定 2026-10-15 14:51:54
- Db2のCREATE INDEX|索引定義・INCLUDEと実行計画の確認 2026-10-15 14:10:22
- Db2の自動採番|IDENTITY・ID取得とRESTARTの注意点 2026-10-15 14:10:22
- 【DB2】特定スキーマの全テーブルの全カラム情報を取得する方法 2026-10-15 13:53:15
- Db2のシーケンスとIDENTITYの違い|採番とカタログの確認SQL 2026-10-15 13:53:15
- Db2で複数カラムをUPDATEする方法|SET・WHEREと更新前の値 2026-10-15 13:53:15