Apache 2 で SSL 電子証明書のパスフレーズ入力を省略する
SERVER
Apache 2 起動時に SSL 電子証明書の秘密鍵に設定されているパスフレーズの入力を省略する方法についてのお話です。
Apache 起動時のパスフレーズの入力を省略する
Apache で SSL サイトを運用する場合、SSL 電子証明書とその秘密鍵のペアをサーバーに格納して、Apache に登録する必要があります。
Apache への登録については EZ-NET: Linux の使い方: Web サーバー apache の SSL 証明書を差し替える (CentOS 5.4) あたりで触れてみましたけれど、ここで登録した秘密鍵にパスフレーズが設定されている場合には、Apache 起動時にそのパスフレーズを入力する必要がでてきます。
パスフレーズが設定されていれば、その秘密鍵を不正に利用される可能性が減る半面、Apache や Linux の再起動のたびにパスフレーズを求められ、正しく入力するまでは Apache を起動することができないところが難点です。
今回は、パスフレーズが自動的に入力されるように、Apache の環境設定を調整する方法について記してみようと思います。
秘密鍵のパスフレーズを取り除く
Apache 起動時のパスフレーズ入力を省略する方法の一つとして、秘密鍵に設定されているパスフレーズを取り除くという方法があります。
例えば "/etc/pki/tls/private/" ディレクトリに "test.key" というパスフレーズの設定された秘密鍵がある場合に、これのパスフレーズを解除した秘密鍵 "test.np.key" を作成する場合には、"/etc/pki/tls/private/" ディレクトリに移動して、次のコマンドを実行します。
openssl rsa -in test.key -out test.np.key
ここでパスフレーズの入力を求められるので、適切なパスフレーズを入力すれば、パスフレーズなしの秘密鍵 "test.np.key" が出来上がります。
秘密鍵を何らかの形で第三者が入手した場合、それを使って SSL サイトを設定されてしまうという危険もあるかとは思いますが、パスフレーズの管理と同じように秘密鍵を管理すれば、大凡は問題ないのではないかと思います。
Apache 起動時にパスフレーズを自動入力する
Apache 起動時のパスフレーズ入力を省略するもう一つの方法として、Apache 起動時に自動的にパスフレーズを入力させる方法があります。
方法としては、Apache の既定ではプロンプトからの入力を求められるパスフレーズの設定を、スクリプトが返す値をパスフレーズとして扱うように Apache の設定を調整することになります。
CentOS 5.4 の場合、/etc/httpd/conf.d/ssl.conf にその設定箇所があります。
SSLPassPhraseDialog builtin
ここを、例えば "/etc/httpd/script/ppfilter.sh" というパスフレーズ入力用のスクリプトを用意している場合には、次のように設定内容を変更します。
SSLPassPhraseDialog exec:script/ppfilter.sh
このように、絶対パスまたは Apache のホームディレクトリの相対パスを使用して、標準出力へパスフレーズを出力するスクリプトを指定することで、Apache 起動時にそのスクリプトの出力結果をパスフレーズとして自動入力してくれるようになります。
ただ、Hyper-V Server 2008 上の CentOS 5.4 (x86_64) で試してみると、パスワード入力用のスクリプトが上手く実行されてくれませんでした。スクリプトファイルの存在までは見つけるのですけど、スクリプトファイルが起動している様子がない感じです。
詳細は確認できなかったのですが、他の CentOS 5 環境では問題なく設定できたこともあるので、何か単純なところを勘違いをしているのかもしれないですけど、今のところ、原因を特定することができませんでした。
なお、パスフレーズ出力スクリプトには、引数として次のものが渡されます。
第一引数 サイト名:ポート番号 第二引数 アルゴリズムの種類 (RSA または DSA) これらを判断材料にして、証明書に対応したパスフレーズを出力するといったことが可能です。
例えばスクリプトの例としては、次のような感じでしょうか。
#!/bin/sh
TARGET_HOST=`echo $1 | cut -d ":" -f 1`
TARGET_PORT=`echo $1 | cut -d ":" -f 2`
ALGORITHM=$2
case ${TARGET_PORT} in
443)
PP=PASSPHRASE
;;
*)
PP=""
esac
echo -n $PP
exit 0
少し複雑な例になりますが、Apache から受け取った二つの引数を変数に格納した後、ポート番号が 443 のものについて "PASSPHRASE" という文字列を変数 PP に格納しています。最後に変数 PP の値を標準出力に出力して終了です。
なお、パスフレーズを出力するスクリプトは安全のため root 権限のみが扱えるようなパーミッション (700 等) にしておく必要があると思います。
このような感じで環境を整えれば、秘密鍵のパスフレーズを解除することなく Apache 起動時に SSL を自動的に有効にすることが可能です。
秘密鍵のパスフレーズを解除しないのでこちらの方が安全かつ本来のやり方だろうとは思うのですが、パスフレーズが同一サーバー上に格納されていることと、Apache の設定を見ればパスフレーズを取得するスクリプトファイルを確認できる都合上、パスフレーズを秘密鍵から取り除く方法とそれほど安全性は変わらないような気もします。