[Linux]OpenSSL
はじめに
OpenSSL(Secure Sockets Layer)は、暗号化や電子証明書の作成・管理を行うための代表的なツールです。SSL/TLS証明書の作成だけでなく、RSA秘密鍵の生成、CSR(証明書署名要求)の作成、自己署名証明書の発行、ハッシュ値の計算など、さまざまな用途で利用されています。
しかし、初めてOpenSSLを触ると「秘密鍵」「CSR」「証明書」といった専門用語が次々と登場し、それぞれがどのような役割を持っているのか分かりにくいと感じることも少なくありません。
本記事では、Linux環境でOpenSSLを使用する基本的な方法を、図を交えながら分かりやすく解説します。まずはRSA秘密鍵・CSR・証明書の関係を理解し、その後で実際のOpenSSLコマンドを使った鍵や証明書の作成手順を順番に見ていきたいと思います。
各ファイルの役割
まずはじめに各ファイルの役割についてですが、「拡張子」と「中身」は必ずしも一致しません。 特に .pem は「ファイル形式」を表し、.key や .crt は「用途」を表すことが多いので注意です。
ここでは一般的な用途について記載します。
| 拡張子 | 主な役割 | 含まれる内容 | 公開してよい? |
|---|---|---|---|
| .key | 秘密鍵 | RSA秘密鍵 | × 絶対に公開しない |
| .csr | 証明書署名要求 | 公開鍵+申請者情報 | ○ 認証局へ送る |
| .crt | 証明書 | 公開鍵+署名+所有者情報 | ○ 公開してよい ※HTTPサーバではこのファイルを公開する |
| .pem | PEM形式のファイル | 秘密鍵・証明書・CSRなど何でも入る | 中身による |
証明書作成の基本的な流れ
SSLアクセスを実現するための証明書作成の流れは以下です。
- 秘密鍵
- CSR
- 自己署名 or 認証局による署名
- 証明書
SSLアクセスは、自分の秘密鍵で署名する自己証明書使う方法と、認証局(CA)に署名してもらう方法があります。
| 自己証明書 | 認証局(CA)発行 |
|---|---|
| 自分の秘密鍵で自分の証明書に署名 | 認証局の秘密鍵で署名 |
| ブラウザは信頼しない(警告が出る) | ブラウザが信頼する |
| テスト用途向け | 本番環境向け |
自己証明書
認証局(CA)による証明書
opensslコマンド
書式
openssl [サブコマンド] [オプション]
openssl [オプション]
opensslのサブコマンド
| サブコマンド | 説明 |
|---|---|
| ca | CA(認証局)の証明書を管理 |
| dgst | メッセージダイジェストを計算 |
| genpkey (genrsa) |
RSA秘密鍵を生成 ※genrsaは旧式でRSAしか扱えないのに対し、genpkeyは様々なアルゴリズムに対応している。現在はgenpkeyが推奨 |
| req | X.509形式の証明書名要求(CSR)を管理 |
| rsa | RSAの鍵を管理 |
| s_client | SSL/TLSプロトコルを使用して指定サーバに接続 |
| s_server | SSL/TLSプロトコルを使用してデータを受けるサーバとして動作 |
| x509 | X.509証明書データ管理 |
genpkey(RSA秘密鍵生成)
openssl genpkey は、秘密鍵(Private Key)を生成するためのコマンドです。
OpenSSL 3.xでは、RSAだけでなくECやEd25519など、さまざまな種類の秘密鍵をこのコマンドで生成できます。そのため、現在では genrsa よりも genpkey の使用が推奨されています。
openssl genpkey -algorithm RSA -out private.key
req(証明書要求CSRを作成)
openssl req -new -key private.key -out request.csr
実行すると次のように入力を求められ、入力が完了するとrequest.csrが作成されます。このcsrファイルは、証明書署名要求用の「公開鍵+申請者情報」となります。
Country Name (2 letter code) [XX]: State or Province Name: Locality Name: Organization Name: Organizational Unit Name: Common Name: Email Address:
以下コマンドで、.csrファイルの内容を確認することができます。
openssl req -in request.csr -text -noout
x509(自己署名)
CSRを自分の秘密鍵で署名します。
openssl x509 \
-req \
-in request.csr \
-signkey private.key \
-out server.crt \
-days 365
ca(認証局による署名)
認証局の秘密鍵で署名します。
openssl ca \
-config openssl.cnf \
-in request.csr \
-out server.crt


コメント
コメントを投稿