RSAの鍵ペアを生成する際、高品質な乱数が必要という事で、どうやったらよいか調べてみた。
openssl コマンドで鍵ペア生成する際、乱数の指定( -rand )として
- 何も指定しない
- 乱数ファイルを指定する(何かのハッシュ値等)
- /dev/randomを指定する
方法があるが、/dev/random は、マシンのエントロピーを利用しているため、処理の進行がなかなか進まない(応答が返ってこない)。
OSは内部のHDDの動き等からエントロピーを取得して、ためているようだが、遅い。
そのため、エントロピーを増やすツールが提供されている。
- rng-tools #物理マシンならコレ
- havege(d) #仮想マシンならコレ
乱数を取得した後、素数判定のために、Miller-Rabin Test をかけるんだから、乱数の品質がどの程度影響あるのか・・・、という気もするが、ここは、深く追求しないことにする。
#真相を知ってる人がいたら教えて欲しい
仮想サーバ(VM)を使っている場合は、CPUに搭載されている乱数生成器(RNG)が使えない?ため、havegedを使うと良いらしい。
【作戦】
- 鍵ペア生成は物理マシンのLinuxで行う。
- opensslでRSA鍵ペア生成する際、-rand オプションで /dev/random を利用する
- /dev/random の値を増やすツールを動かす
今回、作戦3 を中心に記載します。
エントロピープールにどの程度情報がたまっているかを調べる
#cat /proc/sys/kernel/random/entropy_avail
⇒ 2桁位で少ない
エントロピープールの上限値を調べる(デフォルト4096)
# cat /proc/sys/kernel/random/poolsize
rng-toolsをインストールする
# yum install rng-tools
rngd デーモンを起動する
# systemctl start rngd
rngデーモンのステータスを確認する
# systemctl status rngd
現在溜まっているエントロピーを確認し、1000位上、2000位に増えていれば、正常に動作しているものと思われる。
# cat /proc/sys/kernel/random/poolsize
⇒1000~2000位に増えている。
鍵ペアを生成する
# openssl genrsa -rand /dev/random -out /tmp/privatekey.pem 2048
これで、無事、鍵ペア生成ができました。
rngd デーモンを停止する(普段は不要なので)
# systemctl stop rngd
※コメント投稿者のブログIDはブログ作成者のみに通知されます