はじめに
背景
本ドキュメントは OpenSSL コマンドを使い、SSL/TLS の秘密鍵を生成・管理する手順を分かりやすくまとめたガイドです。RSA 鍵の基本から、パスフレーズ付きの安全な鍵、CSR(証明書署名要求)、ECC 鍵、自己署名証明書の作成まで、実践的なコマンド例を交えて説明します。
目的
目的は、手順に沿って安全な鍵を作成し運用できるようにすることです。実際のコマンド例を示すため、学んだらすぐに試せます。
対象読者
Linux や macOS のコマンドラインを使える方、ウェブサーバーやサービスの管理をする方を想定しています。暗号理論の専門知識は不要です。
この記事で学べること
- RSA と ECC の秘密鍵生成の基本手順
- パスフレーズ付き鍵の作成と安全な保管方法
- 秘密鍵から CSR を作る流れ
- 自己署名証明書の作成方法
各項目で具体的な openssl コマンド例を示します。
前提条件
- OpenSSL がインストールされていること
- コマンドラインの基本操作ができること
注意点
秘密鍵は厳重に管理してください。漏洩すると通信の安全が失われます。バックアップは暗号化して保管することをおすすめします。
OpenSSLコマンドを使用したSSL/TLS秘密鍵の生成と管理方法
概要
OpenSSLは秘密鍵の作成や変換、管理に広く使われます。本章では実務で役立つコマンドと注意点を、平易な言葉で説明します。
基本の鍵生成(RSA)
- コマンド例(非推奨フラグを避ける簡潔な例):
openssl genpkey -algorithm RSA -out server.key -pkeyopt rsa_keygen_bits:2048- 例では2048ビットのRSA鍵を作ります。生成後は必ずファイル権限を確認します(
chmod 600 server.key)。
パスフレーズ付き鍵の作成
- コマンド例:
openssl genpkey -algorithm RSA -aes-256-cbc -out server_enc.key -pass pass:yourpass -pkeyopt rsa_keygen_bits:2048- パスフレーズを付けると鍵ファイルの盗難時のリスクを下げられます。パスフレーズは安全に保管してください。
鍵の確認・変換
- 鍵の内容を確認:
openssl pkey -in server.key -text -noout - PEM↔DER変換:
openssl pkey -in key.pem -outform DER -out key.der
管理の実務ポイント
- 権限を限定する(600)。
- 定期的にバックアップし、オフラインで保管する。
- 可能ならハードウェアセキュリティモジュール(HSM)や専用トークンを使う。
よくある操作(例)
- パスフレーズを外す:
openssl pkey -in server_enc.key -out server.key(入力でパスフレーズ要求) - 公開鍵を抽出:
openssl pkey -in server.key -pubout -out pubkey.pem
実務ではコマンドの出力を確認し、鍵の取り扱いルールを作ることが最も重要です。
秘密鍵生成の基本的なプロセス
概要
RSA秘密鍵を生成する基本は1つのコマンドで行えます。よく使う例は次の通りです。
openssl genrsa -out sample.key 2048
このコマンドは2048ビットのRSA鍵を作り、sample.keyに保存します。2048ビットは現在の標準的な安全性を満たす長さです。ファイルは平文(暗号化されていない)で保存されます。
基本手順
- コマンドを実行して鍵を生成します。
- 生成後、ファイルの権限を制限します(例: chmod 600 sample.key)。
- 必要に応じて鍵の内容を確認します(openssl rsa -in sample.key -check -noout)。
- 安全な場所にバックアップし、第三者と共有しないでください。
主なオプションの説明
- -out: 出力ファイル名を指定します。例ではsample.keyです。
- 鍵長(2048など): ビット数で指定します。大きいほど強いですが処理に時間がかかります。
注意点
- 上の方法では鍵はパスフレーズなしで保存されます。運用環境では暗号化やパスフレーズを検討してください(詳細は次章)。
- 互換性のために2048ビットは広く使われますが、セキュリティ要件に応じて4096ビットを使う場合もあります。
- 秘密鍵は厳重に管理し、公開しないでください。
セキュリティを強化したパスフレーズ付き秘密鍵の生成
概要
秘密鍵にパスフレーズを付けると、鍵ファイルそのものが盗まれても第三者が使えないようにできます。ここではAES-256で暗号化した鍵を例に手順と注意点を説明します。
生成手順(例)
- コマンド例:
openssl genrsa -aes256 -out sample.key 2048
- 実行するとパスフレーズ入力を求められます。強く長いフレーズを設定してください。
AES256とDES3の違い
AES-256は現代の推奨暗号です。-des3を指定するとDES3で暗号化されますが、互換性のために使われることがあります。
使用時の注意
パスフレーズ付き鍵は、証明書署名やサーバー起動時に毎回パスフレーズ入力が必要です。自動化が必要な場合は慎重に設計してください。
パスフレーズ管理のポイント
- 長く推測されにくいフレーズを使う
- 安全なパスワードマネージャーで保管
- 定期的に変更する
必要ならパスフレーズを外す方法(openssl rsa)や自動化時の安全対策も続けて説明します。
秘密鍵からCSRへのプロセス
概要
秘密鍵を用いて証明書署名要求(CSR)を作成します。CSRは認証局(CA)に送る情報で、サーバーの識別情報や公開鍵を含みます。CSRを正しく作れば、CAはそれに基づき証明書を発行します。
同時生成(秘密鍵とCSRを同時に作る)
同時に鍵とCSRを作ると手順が短くなります。例:
openssl req -new -newkey rsa:2048 -nodes -keyout server.key -out server.csr
意味:
– -newkey rsa:2048:2048ビットRSA鍵を作成
– -nodes:鍵をパスフレーズで保護しない(無暗号)
– -keyout:出力する秘密鍵ファイル名
– -out:出力するCSRファイル名
プロンプトで国名(C)、都道府県(ST)、組織名(O)、コモンネーム(CN)などを入力します。CNには通常サーバーのFQDN(例: www.example.com)を使います。
既存秘密鍵からCSRのみ生成する
既に秘密鍵がある場合は次のコマンドでCSRだけ作れます。
openssl req -new -key private.key -out server.csr
秘密鍵がパスフレーズで保護されているときは、実行時にパスフレーズを求められます。
SAN(Subject Alternative Name)を含める方法
最近のブラウザはSANが重要です。簡単な方法は設定ファイルを使うことです。例:san.cnfというファイルに次を記載します。
[ req ]
req_extensions = req_ext
distinguished_name = req_distinguished_name
[ req_distinguished_name ]
空のままでもよい
[ req_ext ]
subjectAltName = @alt_names
[ alt_names ]
DNS.1 = www.example.com
DNS.2 = example.com
そして次のように実行します:
openssl req -new -key server.key -out server.csr -config san.cnf -reqexts req_ext
CSRの検証と注意点
作成後は内容を確認してください:
openssl req -text -noout -in server.csr
主な注意点:CNとSANの整合性を確認すること、誤った情報を入れないこと、そして鍵ファイルを安全に保管することです。
ECC秘密鍵の生成(楕円曲線暗号)
概要
ECC(楕円曲線暗号)は、短い鍵長で高い安全性を提供する方式です。例えば、256ビットのECC鍵はRSAの約3072ビットに相当する安全性があります。計算も効率的なため、リソースの限られた環境や高速処理が必要な場面で有利です。
生成手順(例)
- prime256v1曲線を使って秘密鍵を生成します。
openssl ecparam -out ssl.key -name prime256v1 -genkey
このコマンドで、NIST推奨のprime256v1(別名secp256r1)の鍵を作成します。
パスフレーズで保護する方法
秘密鍵を安全に保管するにはパスフレーズで暗号化します。既存の鍵をAES-256で暗号化する例:
openssl ec -in ssl.key -aes256 -out ssl.key.enc
実行時にパスフレーズを入力します。鍵を復号して使う際はパスフレーズが必要です。
公開鍵とCSRの作成
CSR(証明書署名要求)を作る手順はRSAとほぼ同じです。例:
openssl req -new -key ssl.key -out server.csr -sha256
このCSRをCAに提出して署名を受けます。
曲線の選び方と互換性
よく使われる曲線はprime256v1(secp256r1)とsecp384r1です。prime256v1は互換性と性能のバランスが良く、多くの環境で問題なく使えます。一方で古いクライアントはECCをサポートしない場合がある点に注意してください。
確認コマンド
生成した鍵の内容を確認するには:
openssl ec -in ssl.key -text -noout
これで曲線名や公開鍵が表示されます。
実務では、鍵のバックアップと厳重なアクセス管理を忘れずに行ってください。
証明書署名から最終的なサーバー証明書へ
概要
テスト環境では認証局の署名を待たずに自己署名証明書を作成できます。X.509形式の証明書は次のコマンドで作れます。
openssl x509 -req -days 365 -in server.csr -signkey private.key -out server.crt -extfile san.txt
各オプションは有効期限(-days)、CSR入力(-in)、署名用秘密鍵(-signkey)、出力ファイル(-out)、SANの外部設定(-extfile)を指定します。
SAN(代替名)の指定例
san.txt の例:
subjectAltName = DNS:example.com, DNS:www.example.com, IP:192.0.2.1
SANを使うとブラウザやクライアントが正しく証明書を検証します。commonNameだけに頼らないでください。
認証局署名と自己署名の違い
自己署名は内部・開発用に便利です。公開サービスでは信頼済みCAにCSRを送って署名を受ける必要があります。CA署名を行う場合は次のようにCAの鍵と証明書を使います。
openssl x509 -req -in server.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out server.crt -days 365 -extfile san.txt
検証とサーバーへの組み込み
証明書を確認するには:
openssl x509 -in server.crt -text -noout
nginx では:
ssl_certificate /etc/ssl/server.crt;
ssl_certificate_key /etc/ssl/private/private.key;
Apache では SSLCertificateFile / SSLCertificateKeyFile に同様に指定します。
注意点
有効期限は短めに設定し、秘密鍵のパーミッションを厳しく管理してください。SANの正確な指定は接続問題を防ぎます。












