OpenSSL で RSA の秘密鍵を作成する方法

投稿者 : OSCA

[PR] "東野・岡村の旅猿"で登場したロケ地を紹介するファンサイト「あの場所へ行こう!」はこちら。

 本稿では OpenSSL コマンドを用いて、RSA 公開鍵暗号方式の秘密鍵を作成する方法について解説します。

秘密鍵の作成

 OpenSSL のコマンドで RSA 暗号方式の秘密鍵を作成するには openssl genrsa コマンドを利用します。 特に細かい設定を指定しない場合は次のようなコマンドを実行することで作成できます。

$ openssl genrsa > server.key
Generating RSA private key, 1024 bit long modulus
.............................................................++++++
.....++++++
e is 65537 (0x10001)

 コマンドの結果から、1024bit の鍵長の RSA の秘密鍵が作成されたことがわかります。 秘密鍵は server.key という名前でファイルに保存されました。

鍵長を指定した秘密鍵の作成

 但し2014年現在、1024bit の鍵長の秘密鍵では不安です。 今では 2024bit 以上の鍵長が望ましいので、オプションを指定して鍵長を 2024bit にしましょう。 次のようなコマンドで鍵長を指定して秘密鍵を作ることができます。

$ openssl genrsa 2024 > server.key
Generating RSA private key, 2024 bit long modulus
....................+++
....................................................................+++
e is 65537 (0x10001)

 コマンドの結果からも 2024 bit の鍵長の秘密鍵が作成されたことがわかります。

作成した秘密鍵の情報を確認する

 作成した RSA 秘密鍵ファイルを指定して、どのような鍵なのかを確認できるコマンドがあります。 openssl rsa -text コマンドです。 上で作成したファイルを次のようなコマンドで確認してみましょう。

$ openssl rsa -text < server.key
Private-Key: (2024 bit)
modulus:
    00:d8:7d:4e:f5:36:c5:88:12:9c:7d:c1:47:6b:56:
    2c:d5:ab:8b:89:d9:73:fe:dd:9c:1f:e9:31:d3:14:
    (略)
publicExponent: 65537 (0x10001)
privateExponent:
    30:b1:b6:d1:d7:19:05:2b:52:81:c2:b8:a2:bf:06:
    64:a5:2a:44:be:61:a5:e1:08:dd:f0:a0:e1:5e:88:
    (略)
prime1:
    0f:62:96:4b:4b:68:ff:e5:84:1b:a8:90:9a:5e:74:
    89:f1:68:9f:cc:d2:a4:57:fa:4c:0a:5a:77:fe:56:
    (略)
prime2:
    0e:12:45:2c:ee:a5:7e:c5:91:a7:8c:c3:32:00:b9:
    42:a5:31:10:1e:dd:7f:09:8d:f1:10:6f:15:6a:c8:
    (略)
exponent1:
    0c:9b:e0:cf:1e:a3:94:2d:b7:42:af:b8:ab:3b:44:
    49:95:57:08:b8:65:de:18:d8:62:9f:8d:9b:90:0f:
    (略)
exponent2:
    08:f3:9e:86:43:1b:8d:56:6a:9e:c8:71:b4:f1:b8:
    e9:a8:e5:59:78:09:38:b3:ff:54:88:3b:e2:c8:17:
    (略)
coefficient:
    0e:f2:2e:70:c6:b8:a0:e4:91:1c:57:b2:c7:3d:b9:
    48:49:4b:ec:90:4b:0a:d3:a1:22:15:93:be:77:0c:
    (略)
writing RSA key
-----BEGIN RSA PRIVATE KEY-----
MIIEjgIBAAKB/gDYfU71NsWIEpx9wUdrVizVq4uJ2XP+3Zwf6THTFHdvtvf04z4m
hi2cTNrGbWm8h3fxqAT8AUxuZ8kTeXvzyOWLQaifaKR4d6xIA6iPydB/tGaT6dWe
aZz6+QM9cEKH75R/P9n407QVJIN1OI5FhxT9eu3gRudQwZtETM/AMb+Ap8P+r+jy
(略)
-----END RSA PRIVATE KEY-----

 中身を見たところでパッと見て理解できない文字列が並んでいますが、このように鍵の詳細を確認できるということは覚えておくと良いでしょう。

パスフレーズありの秘密鍵の作成

 ところで秘密鍵は作成する際に暗号化することができます。 上で述べた方法では鍵自体が平文で出力されていますので、秘密鍵の管理に気をつける場合には秘密鍵自体も暗号化します。

 秘密鍵の暗号は、共通鍵暗号方式で暗号します。 パスワードが分かる人にだけ平文の秘密鍵を見ることができる仕組みです。 OpenSSL で秘密鍵を暗号化するには DES, DES3, AES128, AES192, AES256 などの方式を利用することができます。 今回は AES256 でパスワードを付けて秘密鍵を暗号化したいと思います。 コマンドは次の通りです。

$ openssl genrsa -aes256 2024 > server.key
Generating RSA private key, 2024 bit long modulus
...............................+++
.........................................................
...................................................................+++
e is 65537 (0x10001)
Enter pass phrase:パスワードを入力
Verifying - Enter pass phrase:もう一度パスワードを入力

 作成した秘密鍵のファイルを、上で述べた鍵の詳細を確認するコマンドで開こうとしてみてください。 すると今度はパスワードを要求されます。

$ openssl rsa -text < server.key
Enter pass phrase:パスワードを入力
Private-Key: (2024 bit)
modulus:
    00:d5:a1:9e:d5:47:3d:e2:a0:1f:7d:e0:d6:86:62:
    02:73:49:4d:a9:22:85:f2:dd:3a:9a:db:96:f8:47:
(以下略)

このように秘密鍵を使おうとすると、パスワードを要求されるようになりますので、秘密鍵自体が安全になりました。

おわりに

今回は OpenSSL コマンドを利用して RSA の秘密鍵を作成する方法について解説しました。 秘密鍵の鍵長、パスワードの有無をプロジェクトの要件から確認し、上記のコマンドを使い分けるようにしてください。 次回は公開鍵を作成します、引き続きご覧ください。

Apache httpd

OpenSSL で RSA の公開鍵を作成する方法

OpenSSL 入門へ戻る

OpenSSLのトップへ戻る

著者 : OSCA

OSCA

Java, PHP 系のWEBエンジニア。 WEBエンジニア向けコミュニティ「WEBエンジニア勉強会」を主催。 個人として何か一つでも世の中の多くの人に使ってもらえるものを作ろうと日々奮闘中。
@engineer_osca