Skip to content

PEM、CRT、KEYファイルの違いとOpenSSLでの扱い方

SSL/TLS証明書と鍵ファイルの種類は混乱しがちですが、OpenSSLを効果的に使用するために各ファイル形式の違いを理解することが重要です。

主要なファイル形式とその役割

基本となるファイルタイプ

ファイル拡張子は単なる慣習

ファイル名の拡張子(.pem、.crt、.keyなど)は単なる命名規則であり、実際のファイル内容が重要です。同じ内容であれば、ファイル名を変更しても機能します。

ファイル形式説明用途
.key秘密鍵ファイルサーバー側でデータの暗号化と署名に使用
.crt/.cert証明書ファイル認証局(CA)が発行した公開鍵証明書
.csr証明書署名要求認証局に証明書の発行を依頼するためのリクエスト
.pemBase64エンコードされたテキスト形式証明書、秘密鍵、CSRなど様々なデータを保持可能
.p12/.pfxPKCS#12形式のコンテナ秘密鍵と証明書をセットで格納
.jksJava KeyStoreJavaアプリケーションでの鍵と証明書の管理

公開鍵と秘密鍵の基本概念

公開鍵基盤(PKI)では、鍵は公開鍵と秘密鍵の2つの部分で構成されます:

  • 公開鍵:誰とでも共有可能。データの検証と復号に使用
  • 秘密鍵:厳重に管理必須。データの暗号化と署名に使用

PEMファイル形式の詳細

PEM(Privacy Enhanced Mail)形式は、Base64でエンコードされたテキストファイルで、様々な暗号化コンポーネントを格納できます。

典型的なPEMファイルの構造:

-----BEGIN EXAMPLE-----
[Base64エンコードされたデータ]
-----END EXAMPLE-----

PEMファイルは以下のいずれかを含む可能性があります:

  • 証明書(BEGIN CERTIFICATE
  • 秘密鍵(BEGIN PRIVATE KEY
  • 証明書署名要求(BEGIN CERTIFICATE REQUEST
  • その他の暗号化オブジェクト

OpenSSLコマンドの実践的理解

自己署名証明書の生成

以下の2つのコマンドは基本的に同じ結果を生成します:

bash
openssl req -x509 -sha256 -nodes -days 365 -newkey rsa:2048 -keyout privateKey.key -out certificate.crt
bash
openssl req -newkey rsa:2048 -new -nodes -x509 -days 3650 -keyout key.pem -out cert.pem

これらのコマンドは:

  • RSA 2048ビットの鍵ペアを生成
  • 証明書署名要求(CSR)を作成
  • 自己署名証明書を生成(-x509オプション)
  • パスフレーズなしの鍵を生成(-nodesオプション)

PKCS12とJKSへの変換

注意

Javaアプリケーションで使用する場合は、PKCS12形式からJKS形式への変換が必要な場合があります。

bash
# PEMとKEYからPKCS12ファイルを作成
openssl pkcs12 -export -in user.pem -inkey user.key -certfile user.pem -out testkeystore.p12

# PKCS12からJKSへ変換
keytool -importkeystore -srckeystore testkeystore.p12 -srcstoretype pkcs12 -destkeystore wso2carbon.jks -deststoretype JKS

ファイル形式の判別方法

ファイルの内容を確認して実際の形式を判断することが重要です:

bash
# ファイルの種類を確認
file certificate.crt

# PEMファイルの内容を表示
openssl x509 -in certificate.pem -text -noout

# 秘密鍵の情報を表示
openssl rsa -in private.key -text -noout

実践的な使用例

Webサーバー設定の場合

  • 秘密鍵:サーバー設定で指定(ApacheのSSLCertificateKeyFile
  • 証明書:サーバー設定で指定(ApacheのSSLCertificateFile
  • 中間証明書:別途指定または証明書ファイルに結合

アプリケーションでの使用

Javaアプリケーションでは、JKSまたはPKCS12形式のキーストアを使用します:

bash
# 既存の秘密鍵と証明書から直接PKCS12を作成
openssl pkcs12 -export -in domain.crt -inkey domain.key -out domain.p12

トラブルシューティングのヒント

セキュリティ警告

秘密鍵ファイル(.key)は決して公開したり、バージョン管理システムにコミットしたりしないでください。

  1. パーミッションの問題:秘密鍵ファイルのパーミッションを適切に設定(例: 600)
  2. 形式の不一致:ファイルの実際の内容と拡張子が一致しているか確認
  3. 証明書チェーン:中間証明書が正しくインクルードされているか確認

高度な例とリソース

より複雑なシナリオや学習リソースが必要な場合は、Self-Signed SSL Generatorのようなプロジェクトを参照すると、実践的な例を通じて理解を深めることができます。

OpenSSLと証明書の管理は初めてだと難しく感じるかもしれませんが、各ファイルの役割と形式の違いを理解すれば、効果的に使用できるようになります。