| この記事の要点 |
|
概要
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アノテーションとは
最近更新/作成されたページ
- djangoのテンプレートの作成とヘッダー・フッターの共通化 2026-10-03 21:41:49
- テンプレートフラグメント(ヘッダー等の共有化) 2026-10-03 21:41:49
- reCAPTCHA v3 使い方(サンプル付き) 2026-10-03 21:37:05
- Content-Type一覧|MIMEタイプとはとHTTPでの主な使用場面 2026-10-03 21:37:05
- SpringにおけるAOPの使い方 2026-10-03 21:37:05
- X (Twitter) API でツイートできないがエラーが出ない問題の原因と対処 2026-10-03 11:33:01
- X (Twitter) API アプリケーション登録完全ガイド|v2・Bearer Token・OAuth 2.0 PKCE 2026-10-03 11:33:01
- X (Twitter) API 完全ガイド|従量課金の料金・単価(2026年10月)と v2 移行 2026-10-03 11:32:40
- Google DeepMind とは?Gemini・AlphaFold の開発元 2026-10-03 11:26:56
- Cursor とは?AI 統合型コードエディタの使い方・料金 2026-10-03 11:26:56
- Claude (Anthropic) とは?AIチャットの使い方・モデルファミリ・API 2026-10-03 11:26:56
- AIベンダー一覧:OpenAI・Anthropic・Google DeepMind・Microsoft・Meta 2026-10-03 11:26:56
- クラウド・インフラ完全ガイド — AWS/Azure/GCP/Kubernetes 2026-10-03 11:26:56
- テキストエディタ完全比較 (VS Code / Cursor / Vim / Emacs / IDE) 2026-10-03 11:26:56
- プログラミング学習プラットフォーム|Scratch・micro:bit ほか 2026-10-03 11:26:56