SSL証明書と秘密鍵はいくつかのファイル形式で保存できます。内容は同じで、エンコーディングとパッケージングが異なります。ほとんどの混乱は、サーバーが特定の形式を必要とすることから生じます。
フォーマット比較
| フォーマット | 拡張子 | エンコーディング | 含む内容 | 使用される場所 |
|---|---|---|---|---|
| PEM | .pem, .crt, .cer, .key | Base64(テキスト) | 証明書、鍵、またはチェーン(ファイルごとに1つ) | Nginx, Apache, ほとんどのLinuxサーバー |
| DER | .der, .cer | バイナリ | 単一の証明書または鍵 | Java, 一部のWindowsアプリ |
| PFX/PKCS#12 | .pfx, .p12 | バイナリ | 証明書 + 鍵 + チェーンを1ファイルに | Windows IIS, Azure, macOS Keychain |
PEM — 最も一般的なフォーマット
PEM(Privacy Enhanced Mail)はBase64エンコードされたテキストです。テキストエディタで開けます:
-----BEGIN CERTIFICATE-----
MIIFYjCCBEqgAwIBAgISA8ht...
(base64 encoded data)
-----END CERTIFICATE-----
PEMファイルには証明書、秘密鍵、または証明書チェーンを含めることができます。ヘッダーで中身がわかります:
BEGIN CERTIFICATE— 証明書BEGIN PRIVATE KEY— 秘密鍵(またはBEGIN RSA PRIVATE KEY/BEGIN EC PRIVATE KEY)BEGIN CERTIFICATE REQUEST— CSR
GetHTTPSはPEM形式で出力します — privkey.pem、cert.pem、chain.pem、fullchain.pem。
DER — バイナリエンコーディング
DERは、PEMがテキストとしてエンコードするのと同じデータのバイナリ形式です。人間には読めません。主にJavaアプリケーション(keytool)や一部のWindowsコンポーネントで使用されます。
PFX/PKCS#12 — バンドル形式
PFX(Personal Information Exchange)は証明書、秘密鍵、チェーンを1つのパスワード保護されたファイルにバンドルします。Windows IIS、Azure App Service、macOS Keychainがこの形式を必要とします。
フォーマット間の変換
すべての変換にOpenSSLを使用します:
PEM → PFX
openssl pkcs12 -export \
-out certificate.pfx \
-inkey privkey.pem \
-in cert.pem \
-certfile chain.pem
エクスポートパスワードの設定を求められます。
PFX → PEM
# 証明書を抽出
openssl pkcs12 -in certificate.pfx -clcerts -nokeys -out cert.pem
# 秘密鍵を抽出
openssl pkcs12 -in certificate.pfx -nocerts -nodes -out privkey.pem
# チェーンを抽出
openssl pkcs12 -in certificate.pfx -cacerts -nokeys -out chain.pem
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
どのフォーマットが必要か?
| サーバー/プラットフォーム | フォーマット | 必要なファイル |
|---|---|---|
| Nginx | PEM | fullchain.pem + privkey.pem |
| Apache | PEM | cert.pem + chain.pem + privkey.pem |
| IIS(Windows) | PFX | certificate.pfx(PEMから変換) |
| Azure App Service | PFX | certificate.pfx |
| AWS(ACM) | PEM | cert.pem + chain.pem + privkey.pem(コンソールに貼り付け) |
| Java(Tomcat) | JKSまたはPFX | PEM → PFX → JKSにkeytoolで変換 |
| Node.js | PEM | コードで直接ファイルを読み込み |
ファイルのフォーマットを特定する方法
ファイルの形式がわからない場合の確認方法:
# "-----BEGIN"で始まるならPEM(base64テキスト)
head -1 mystery-file.pem
# バイナリ(文字化け)ならDERまたはPFX
file mystery-file.cer
# "data"や"certificate"と出力 = DER
# "PKCS12"と出力 = PFX
# PEM証明書を調査
openssl x509 -in cert.pem -noout -text
# DER証明書を調査
openssl x509 -in cert.der -inform DER -noout -text
# PFXファイルを調査
openssl pkcs12 -in cert.pfx -info -nokeys
よくあるファイル拡張子の混乱
| 拡張子 | 通常の意味 | 別の可能性 |
|---|---|---|
.pem | PEM(base64) | 常にPEM |
.crt | PEM証明書 | WindowsではDER |
.cer | PEM証明書 | WindowsではDER |
.key | PEM秘密鍵 | DER(まれ) |
.pfx | PKCS#12バンドル | 常にPFX |
.p12 | PKCS#12バンドル | 常にPFX(.pfxと同じ) |
.der | DER(バイナリ) | 常にDER |
.jks | Java KeyStore | 常にJKS |
経験則: テキストエディタでファイルを開いてください。-----BEGIN CERTIFICATE-----が見えればPEMです(拡張子に関係なく)。バイナリのゴミが見えればDERまたはPFXです。
よくある質問
.crt、.cer、.pemの違いは何ですか?
すべてPEM形式の場合があります。拡張子は命名規則であり、形式の指標ではありません。.crtと.cerは証明書ファイルに一般的に使用され、.pemはPEMエンコードされたあらゆるファイルに使用されます。Windowsでは、.cerファイルがDERエンコードされている場合があります。テキストエディタで開いて確認してください。
GetHTTPSはなぜ4つのファイルをくれるのですか?
最大限の互換性のためです。GetHTTPSは以下を提供します:privkey.pem(秘密鍵)、cert.pem(証明書のみ)、chain.pem(中間認証局証明書)、fullchain.pem(証明書 + チェーンを結合)。Nginxはfullchain.pemが必要で、Apacheは別々のcert.pem + chain.pemが必要で、IISはPFX(PEMから変換)が必要です。
Windows/IIS用のPFXを作成するにはどうすればいいですか?
上記のOpenSSL PEM → PFXコマンドを使用してください。GetHTTPSからのprivkey.pem、cert.pem、chain.pemが必要です。生成される.pfxはIIS、Azure App Service、またはmacOS Keychainにインポートできます。
秘密鍵なしでフォーマット間の変換はできますか?
証明書はPEMとDER間で秘密鍵なしに変換できます。ただし、PFXの作成には秘密鍵が必要です(証明書 + 鍵をバンドルします)。秘密鍵を紛失した場合は、新しい証明書を生成する必要があります。
Let’s Encryptはどのフォーマットを使用しますか?
Let’s Encrypt(GetHTTPSを含むあらゆるACMEクライアント経由)はPEM形式で出力します。サーバーに別の形式が必要な場合は、上記のOpenSSLコマンドで変換してください。