証明書とキーファイルの拡張子完全ガイド:PEM、CRT、DER、PFXなど
Webサーバー(NginxやApacheなど)をセットアップしたり、SSHキーを管理したり、デジタル署名を扱ったりしたことがあるなら、.pem、.crt、.cer、.der、.p12、.pfx、.key、.csrなど、紛らわしいファイル拡張子の数々に遭遇したことがあるでしょう。
これらはすべて同じものなのでしょうか?単に名前を変更するだけでいいのでしょうか?このガイドでは、これらの拡張子の謎を解き明かし、その中身を説明し、それらを効果的に扱う方法を紹介します。
なぜこれほど多くの拡張子があるのか?
混乱の原因は主に2つあります。
- 標準 (X.509): これは公開鍵証明書の国際標準です。
- エンコーディング: 証明書データが実際にファイルにどのように保存されているか(Base64 ASCIIテキスト vs. バイナリ)。
本質的には、異なるプラットフォーム(Windows vs. Linux)、異なるサーバー(IIS vs. Nginx)、および異なるプロトコル(SSL/TLS vs. SSH vs. PGP)が、歴史的に同じ基礎となる暗号情報を保存するために異なる方法を好んできたためです。
クイックリファレンス表:一般的な証明書とキーの拡張子
| 拡張子 | フォーマット | 説明 | 一般的な用途 |
|---|---|---|---|
.pem |
ASCII (Base64) | Privacy Enhanced Mail | Webサーバー (Nginx, Apache)、SSL/TLS証明書、秘密鍵 |
.crt, .cer |
ASCII または バイナリ | 証明書 (Certificate) | 公開証明書のみ(秘密鍵は含まない) |
.der |
バイナリ | Distinguished Encoding Rules | Javaプラットフォーム、Windows(特定のCA証明書によく使用される) |
.key |
ASCII または バイナリ | 秘密鍵 (Private Key) | 公開証明書に対応する秘密鍵 |
.csr |
ASCII (Base64) | 証明書署名要求 (Certificate Signing Request) | 署名済み証明書を要求するためにCAに送信されるファイル |
.p12, .pfx |
バイナリ | PKCS#12アーカイブ | 証明書とその秘密鍵を1つのパスワード保護されたファイルにまとめたもの |
.p7b, .p7c |
ASCII (Base64) | PKCS#7 / CMS | 証明書チェーンの書き出し(秘密鍵は含まない) |
.asc, .sig, .gpg |
ASCII または バイナリ | PGP / OpenPGP | デジタル署名、暗号化メール、ソフトウェアの検証 |
1. X.509 証明書のエンコーディング(「ビッグスリー」)
PEM (Privacy Enhanced Mail) — .pem, .crt, .cer, .key
これは Linux や Web サーバーで最も一般的に遭遇する形式です。ASCII(テキストベース)形式で、-----BEGIN CERTIFICATE----- のようなヘッダーで始まり、-----END CERTIFICATE----- で終わります。その間のデータは Base64 でエンコードされています。
- 利点: 人間が読める形式で、設定ファイルへのコピー&ペーストが容易です。
- 拡張子の使用:
.pemが標準ですが、技術的にはすべて PEM 形式であっても、公開証明書には.crtや.cerを、秘密鍵には.keyを使用する人が多いです。
DER (Distinguished Encoding Rules) — .der, .cer
これは PEM ファイルのバイナリ版です。テキストエディタで開くと「文字化け」して見えます。
- 利点: PEM よりもコンパクトです。
- 入手場所: Java 環境、Windows の証明書エクスポート、一部のハードウェアセキュリティモジュール (HSM) などで一般的です。
PKCS#12 (Personal Information Exchange) — .p12, .pfx
通常1つの証明書やキーを保持する PEM や DER とは異なり、PKCS#12 はアーカイブ形式です。証明書、その秘密鍵、および CA チェーン全体を、パスワードで保護された1つのファイルに保存できます。
- 入手場所: Windows (IIS)、Java (KeyStore)、macOS のキーチェーンの標準形式です。
- 注意:
.pfxは古い Microsoft の拡張子で、.p12は新しいクロスプラットフォームの標準ですが、機能的には同一です。
2. 要求とメタデータの拡張子
CSR (Certificate Signing Request) — .csr
これは証明書自体ではありません。サーバー上で生成した要求(公開鍵と組織情報を含む)であり、認証局(Let's Encrypt、DigiCert など)に送信するものです。CA はこれに署名し、.crt または .pem ファイルを返します。
PKCS#7 / CMS — .p7b, .p7c
この形式は主に「証明書チェーン」を共有するために使用されます。自身の証明書に加えて、中間 CA およびルート CA 証明書が含まれる場合があります。秘密鍵は決して含まれません。CA から「Windows」または「IIS」形式で証明書をダウンロードするときによく見かけます。
3. PGP および GPG の拡張子
ソフトウェアのダウンロード(Linux カーネルや人気のあるライブラリなど)を検証する場合、以下のようなファイルを目にすることがあります。
.asc: ASCII アーマー形式の PGP ファイル(テキストベースの署名)。.sig,.gpg: バイナリ形式の PGP 署名またはキー。.pub: PGP 公開鍵を示すためによく使用されます。
4. これらのファイルを開いて検証する方法
Linux / macOS / Windows (OpenSSL を使用)
OpenSSL は、これらのファイルを扱うためのスイスアーミーナイフです。一般的なコマンドをいくつか紹介します。
PEM ファイル(公開証明書)を表示する:
openssl x509 -in certificate.crt -text -noout
DER ファイル(バイナリ)を表示する:
openssl x509 -in certificate.der -inform der -text -noout
PKCS#12 (.p12 / .pfx) ファイルを表示する:
openssl pkcs12 -info -in key-and-cert.p12
5. フォーマット間の変換
プラットフォームによっては、特定の形式が必要になることがよくあります。変換方法は以下の通りです。
PEM から DER へ:
openssl x509 -in cert.pem -outform der -out cert.der
DER から PEM へ:
openssl x509 -in cert.der -inform der -outform pem -out cert.pem
PEM から PFX (.p12) へ:(証明書と秘密鍵を組み合わせる必要があります)
openssl pkcs12 -export -out certificate.pfx -inkey private.key -in certificate.crt -certfile CA-chain.crt
よくある質問 (FAQ)
Q: .pem ファイルの名前を単に .crt に変更しても大丈夫ですか?
A: 多くの場合、はい。ほとんどの Web サーバー(Nginx など)は、拡張子ではなくファイル内の "BEGIN CERTIFICATE" ヘッダーを探します。ただし、プラットフォームがバイナリの .der ファイルを期待している場合に、名前を変更しただけの .pem ファイルを渡すと失敗します。
Q: .p12 と .pfx の違いは何ですか?
A: 機能的な違いはありません。.pfx は Microsoft の独自拡張子でしたが、.p12 は業界標準 (PKCS#12) です。どちらも証明書と秘密鍵をパスワードで保護して格納するコンテナとして機能します。
Q: なぜ .p7b ファイルの中に秘密鍵が見当たらないのですか?
A: PKCS#7 標準(.p7b で使用)は証明書の配布専用に設計されており、秘密鍵の保存をサポートしていないためです。秘密鍵をまとめる必要がある場合は、PKCS#12 (.p12) を使用する必要があります。
Q: .key ファイルは常に秘密鍵ですか?
A: 通常はそうですが、常にとは限りません。.key は秘密鍵の慣習的な拡張子ですが、ベンダーによっては公開鍵やライセンスファイルに使用することもあります。常に内容を確認してください(例:-----BEGIN PRIVATE KEY-----)。
Tool3M の関連ツール
- ハッシュ生成器: SHA-256 を使用して、ダウンロードした証明書ファイルの完全性を検証します。
- SSL/TLS 証明書ガイド: 基盤となるセキュリティプロトコルの詳細を学びます。