[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アクセスを実現するための証明書作成の流れは以下です。

  1. 秘密鍵
  2. CSR
  3. 自己署名 or 認証局による署名
  4. 証明書

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

コメント

このブログの人気の投稿

docker-compose up で proxyconnect tcp: dial tcp: lookup proxy.example.com: no such host

[Azure]キーコンテナー (Azure Key Vault)

[Java] JDBCドライバでMySQL接続するまでの手順