SSL証明書を扱っていると、.pem .crt .cer .der .key .pfx .p12 .csr と似たような拡張子がいろいろ出てきて、何が違うのか混乱しますよね。
結論から言うと、「中身のエンコード方式(PEM か DER か)」と「中に何が入っているか(証明書か・鍵か・両方か)」の2軸で整理すると分かりやすくなります。この記事ではその地図を示します。
まず2軸で考える
証明書まわりのファイルは、次の2つを分けて考えると整理できます。
- エンコード方式 … 中身を「テキスト(PEM)」で持つか「バイナリ(DER)」で持つか
- 中身の種類 … 証明書・秘密鍵・その両束・署名リクエスト(CSR)のどれが入っているか
拡張子は中身を保証しません(.crt なのに中身は PEM、ということは普通にあります)。 迷ったら拡張子より中身を見るのが確実です。見分け方は後半で説明します。
エンコード方式:PEM と DER
| PEM | DER | |
|---|---|---|
| 中身 | テキスト(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.crt.cer.der.key.pfxなどは、「テキスト(PEM)かバイナリ(DER)か」×「中身が証明書か鍵か束か」の組み合わせで整理できます。- 拡張子は中身を保証しないので、迷ったら
-----BEGIN ...-----行を見る/openssl で開くのが確実です。 - そもそも「鍵」と「証明書」がどういう関係なのかは 公開鍵・秘密鍵・証明書の関係をやさしく図解 をどうぞ。