PEM、CRT、KEYファイルの違いとOpenSSLでの扱い方
SSL/TLS証明書と鍵ファイルの種類は混乱しがちですが、OpenSSLを効果的に使用するために各ファイル形式の違いを理解することが重要です。
主要なファイル形式とその役割
基本となるファイルタイプ
ファイル拡張子は単なる慣習
ファイル名の拡張子(.pem、.crt、.keyなど)は単なる命名規則であり、実際のファイル内容が重要です。同じ内容であれば、ファイル名を変更しても機能します。
ファイル形式 | 説明 | 用途 |
---|---|---|
.key | 秘密鍵ファイル | サーバー側でデータの暗号化と署名に使用 |
.crt/.cert | 証明書ファイル | 認証局(CA)が発行した公開鍵証明書 |
.csr | 証明書署名要求 | 認証局に証明書の発行を依頼するためのリクエスト |
.pem | Base64エンコードされたテキスト形式 | 証明書、秘密鍵、CSRなど様々なデータを保持可能 |
.p12/.pfx | PKCS#12形式のコンテナ | 秘密鍵と証明書をセットで格納 |
.jks | Java KeyStore | Javaアプリケーションでの鍵と証明書の管理 |
公開鍵と秘密鍵の基本概念
公開鍵基盤(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つのコマンドは基本的に同じ結果を生成します:
openssl req -x509 -sha256 -nodes -days 365 -newkey rsa:2048 -keyout privateKey.key -out certificate.crt
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形式への変換が必要な場合があります。
# 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
ファイル形式の判別方法
ファイルの内容を確認して実際の形式を判断することが重要です:
# ファイルの種類を確認
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形式のキーストアを使用します:
# 既存の秘密鍵と証明書から直接PKCS12を作成
openssl pkcs12 -export -in domain.crt -inkey domain.key -out domain.p12
トラブルシューティングのヒント
セキュリティ警告
秘密鍵ファイル(.key)は決して公開したり、バージョン管理システムにコミットしたりしないでください。
- パーミッションの問題:秘密鍵ファイルのパーミッションを適切に設定(例: 600)
- 形式の不一致:ファイルの実際の内容と拡張子が一致しているか確認
- 証明書チェーン:中間証明書が正しくインクルードされているか確認
高度な例とリソース
より複雑なシナリオや学習リソースが必要な場合は、Self-Signed SSL Generatorのようなプロジェクトを参照すると、実践的な例を通じて理解を深めることができます。
OpenSSLと証明書の管理は初めてだと難しく感じるかもしれませんが、各ファイルの役割と形式の違いを理解すれば、効果的に使用できるようになります。