nginx 起動時に秘密鍵のパスフレーズを自動で入力させる

Web サイト

SSL 電子証明書の秘密鍵にパスフレーズを設定していると、Web サーバーを起動する度にパスフレーズの入力が必要になります。

OS を再起動する度に再入力するのは現実的ではないので、OS 起動時に自動でパスワードが入力されるようにしてみました。


Web サーバー nginx で SSL 電子証明書の秘密鍵にパスフレーズを設定していると、Web サーバーを起動する度にパスフレーズの入力が必要になります。

Linux を再起動する度に再入力するのは現実的ではないので、Linux 起動時に nginx を自動起動させるのに合わせて SSL 電子証明書の秘密鍵に設定されているパスフレーズを自動入力させてみることにしました。

できれば、普段と同じように service nginx start で自動入力したかったのですけど、実現方法がわからなかったため、今回は専用の起動用スクリプトを作って使う方法にしています。

nginx を設定した時のお話は こちら で紹介しています。

expect をインストールする

パスフレーズを自動で入力するのに、今回は expect というツールを使うことにします。CentOS 5.11 では yum を使って次のようにインストールできます。

yum install expect

起動用スクリプトを作成する

そして expect を使ってパスフレーズを自動入力するためのスクリプトを作成します。

今回は次のような内容で /etc/nginx/script/nginx-start という名前で作成しておくことにしました。

#!/bin/sh

. /etc/nginx/script/pp.txt

/usr/bin/expect -c "
set timeout 20
spawn service nginx start
log_file /var/log/expect-nginx.log
expect \"Enter PEM pass phrase:\"
send \"${PP}\n\"
interact
"

また、このスクリプトではパスフレーズを /etc/nginx/script/pp.txt から取り込むようにしています。このファイルは次のように作成します。

PP="********"

ここの PP に、SSL で使う電子証明書の秘密鍵に設定したパスフレーズを指定します。


これらのファイルの準備ができたら、次のようにパーミッションを調整します。

chmod +x /etc/nginx/script/nginx-start
chmod go-r /etc/nginx/script/pp.txt

これで起動用スクリプトの準備ができました。

起動用スクリプトの動きとしては、最初に別ファイル (/etc/nginx/script/pp.txt ) に記載したパスフレーズを取り込んでから、expect コマンドを使って service nginx start を実行、そして Enter PEM pass phrase: と表示されたらパスフレーズを自動で入力する、という流れになります。


あとは次のようにすることで、nginx の起動と合わせて、秘密鍵のパスフレーズを自動で入力してくれます。

/etc/nginx/script/nginx-start

起動用スクリプトを使って nginx を起動する

Linux 起動時に、ここで作成した起動用スクリプトを使って nginx を起動させるようにしてみます。

通常は /etc/init.d/nginx を Linux 起動時に自動でスタートさせて nginx を起動させる方法がとられると思いますが、今回は先ほど作成した『パスフレーズを自動入力してくれる起動用スクリプト』を使って起動させるようにします。

そのために、まずは Linux 起動時の自動スタートを無効化します。

chkconfig nginx off

これで nginx の自動起動が無効になりました。

そうしたら、システム起動の最後に任意のスクリプトを実行させるのに使う /etc/rc.local の最後の方に次の1行を追加します。

/etc/nginx/script/nginx-start

こうすることで、Linux が起動した最後あたりに自作の nginx 起動用スクリプトが実行されて、nginx の起動とパスフレーズの自動入力が行われます。