証明書ファイルの形式まとめ — PEM / DER / PFX(p12) / CRT / CER / KEY / CSR の違い

SSL証明書を扱っていると、.pem .crt .cer .der .key .pfx .p12 .csr と似たような拡張子がいろいろ出てきて、何が違うのか混乱しますよね。

結論から言うと、「中身のエンコード方式(PEM か DER か)」と「中に何が入っているか(証明書か・鍵か・両方か)」の2軸で整理すると分かりやすくなります。この記事ではその地図を示します。

まず2軸で考える

証明書まわりのファイルは、次の2つを分けて考えると整理できます。

  1. エンコード方式 … 中身を「テキスト(PEM)」で持つか「バイナリ(DER)」で持つか
  2. 中身の種類 … 証明書・秘密鍵・その両束・署名リクエスト(CSR)のどれが入っているか

拡張子は中身を保証しません(.crt なのに中身は PEM、ということは普通にあります)。 迷ったら拡張子より中身を見るのが確実です。見分け方は後半で説明します。

エンコード方式:PEM と DER

PEMDER
中身テキスト(Base64)バイナリ
目印-----BEGIN ...----- で始まる目印なし(開くと文字化け)
行末-----BEGIN/END----- で挟む
主な用途Apache, nginx, Linux系全般Java, Windows, 一部の機器
拡張子の例.pem .crt .cer .key.der .cer
  • PEM … 中身を Base64 でテキスト化し、-----BEGIN CERTIFICATE----- のような行で挟んだもの。メモ帳で開くと読めます(中身の意味は分かりませんが)。1つのファイルに証明書や鍵を何個でも連結できるのが特徴です。
  • DER … 同じ中身をバイナリのまま持ったもの。テキストエディタで開くと文字化けします。

PEM は DER を Base64 でテキスト化したもの、という関係です(中身の証明書そのものは同じ)。

中身の種類:証明書・鍵・束・CSR

拡張子よくある中身PEM での目印(-----BEGIN ...)
.crt .cer証明書1枚CERTIFICATE
.key秘密鍵PRIVATE KEY / RSA PRIVATE KEY / EC PRIVATE KEY
.csr証明書署名要求(CSR)CERTIFICATE REQUEST
.pem上記いずれでも(証明書+鍵を束ねることも)複数混在しうる
.pfx .p12証明書+秘密鍵+中間証明書を1つにまとめたもの(PKCS#12、バイナリ・パスワード付き)バイナリなので目印なし

それぞれ補足します。

  • .crt.cer … どちらも「証明書」です。歴史的に Unix系は .crt、Windows系は .cer を使いがち、という程度の違いで、中身は PEM のことも DER のこともあります。
  • .key … 秘密鍵です。-----BEGIN PRIVATE KEY-----(PKCS#8。最近の標準)や、-----BEGIN RSA PRIVATE KEY-----(PKCS#1。昔ながらの形式)などのバリエーションがあります。秘密鍵は他人に渡さないファイルです。
  • .csr … 認証局(CA)に証明書を発行してもらうときに送る「申請書」です。中身は公開鍵+申請者情報で、秘密鍵は含みません。
  • .pfx / .p12 … 「PKCS#12」という形式で、証明書と秘密鍵をまとめて1ファイル+パスワードで保護したものです。Windows(IIS)や、証明書のインポート/エクスポートでよく登場します。中身はバイナリです。

.pem は「入れ物」の名前

.pem は中身の種類を表しません。PEM 形式(テキスト)で書かれている、という入れ物の名前です。 だから .pem の中身は「証明書だけ」のことも、「秘密鍵だけ」のことも、「証明書+鍵+中間証明書を全部連結」のこともあります。

-----BEGIN PRIVATE KEY-----
(秘密鍵のBase64)
-----END PRIVATE KEY-----
-----BEGIN CERTIFICATE-----
(サーバ証明書のBase64)
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
(中間証明書のBase64)
-----END CERTIFICATE-----

このあたりは pem ファイルとは?(SSL証明書の中身を確認する方法) で詳しく扱っています。

ファイルの中身を見分ける方法

拡張子はあてになりません。実際に中を覗いて判断しましょう。

1. テキストエディタ / cat で開く

-----BEGIN ...----- で始まっていれば PEM です。 何が入っているかも、この BEGIN 行の単語(CERTIFICATE / PRIVATE KEY / CERTIFICATE REQUEST)で分かります。 文字化けするなら DER(バイナリ)か、.pfx/.p12 のようなバイナリ形式です。

2. file コマンド(ざっくり判定)

file mystery.crt mystery.der
# 例: mystery.crt: PEM certificate
#     mystery.der: Certificate, Version=3   ← DER(バイナリ)も最近の file は中身を認識

古い file だと DER が data(ただのバイナリ)としか出ないこともあります。確実に判定したいときは次の openssl を使ってください。

3. openssl で中身を確定させる

PEM の証明書として読めるか試す(読めればPEM):

openssl x509 -in mystery.crt -noout -text

DER だと上は失敗します。その場合は -inform der を付けて試します:

openssl x509 -inform der -in mystery.cer -noout -text

1つの pem に何が入っているかをまとめて見たいときは storeutl が便利です(OpenSSL 3.x):

openssl storeutl -noout -text bundle.pem

証明書・鍵・CSR それぞれの中身を読むコマンドは opensslで証明書・鍵・CSR・接続を確認するコマンド総まとめ にまとめています。

変換について

「PFX を PEM に」「DER を PEM に」「crt と key を1つに」といった形式の変換は、用途別にワンライナーがあります。長くなるので別記事にまとめました。

PEM ⇄ DER / CRT / KEY / PFX(p12) 変換opensslワンライナー集

さいごに

  • .pem .crt .cer .der .key .pfx などは、「テキスト(PEM)かバイナリ(DER)か」×「中身が証明書か鍵か束か」の組み合わせで整理できます。
  • 拡張子は中身を保証しないので、迷ったら -----BEGIN ...----- 行を見る/openssl で開くのが確実です。
  • そもそも「鍵」と「証明書」がどういう関係なのかは 公開鍵・秘密鍵・証明書の関係をやさしく図解 をどうぞ。