それマグで!

知識はカップより、マグでゆっくり頂きます。 takuya_1stのブログ

習慣に早くから配慮した者は、 おそらく人生の実りも大きい。

Apacheの起動時にSSLのパスフレーズを省略する方法

ApacheHTTPS暗号化通信を使うと、SSL秘密鍵のパスフレーズを訊かれます。パスフレーズ入力をしないと先に進まない。そのため障害復旧時Apacheが起動せずアタフタしました。調べ見たらPassphraseのダイアログでとまっていました。

Apacheパスワード入力ダイアログを省略する方法

  1. 鍵のパスフレーズを消す
  2. 別ファイルにパスフレーズを書いておく

どちらの方法もセキュリティ強度を下げることには変わりはないです。2の方法はシェルスクリプトを起動するので、Wgetパスフレーズを取得すると行ったアクロバットな方法も可能です。柔軟性を重視するなら2がおすすめです。複数証明書がある場合は2が楽です。

パスフレーズをファイルから読み込む方法

Apacheがファイルを参照するように設定

SSLPassPhraseDialog の値を変更します

dialog パスフレーズ入力ダイアログをだします
exec:/path/to/script スクリプトを実行し標準出力をパスフレーズに使います

ApacheSSL設定を編集しexecに変更します。

Debianなら /etc/apache2/mods-enabled/ssl.conf)

 32 #   Pass Phrase Dialog:
 33 #   Configure the pass phrase gathering process.
 34 #   The filtering dialog program (`builtin' is a internal
 35 #   terminal dialog) has to provide the pass phrase on stdout.
 36 #SSLPassPhraseDialog  builtin              #初期設定
 37 SSLPassPhraseDialog  exec:/etc/apache2/certs/pass_phrase.sh #今回の設定
 38
パスワード入力スクリプトを作りました

/etc/apache2/certs/pass_phrase.sh

#!/bin/sh
echo "my pass phrase"
入力スクリプトを起動して試してみます。
$ /etc/apache2/certs/pass_phrase.sh
my pass phrase

実行権限を忘れずに。(安全のためpermissionは500 でオーナーはRootにしました。)

Apache再起動します
sudo /etc/init.d/apache2 restart

再起動時にパスフレーズが自動入力されたらOK

スクリプトファイルに渡される引数

スクリプトファイルにはApacheから引数が渡されます。コレを使って条件分岐が可能になります。SSLPassPhraseDialogスクリプトにサーバー名とポート、暗号化方式を渡してくれる。

/etc/apache2/certs/pass_phrase.sh www.exmaple.com:443 RSA

のように、証明書ごとに起動してくれます。そこで、サーバーごとにパスフレーズを変えておくことが可能になります。

サーバーごとに違うパスフレーズを設定する。

/usr/local/apache/bin/pp_filter

#!/bin/sh

case $1 in
    www1.example.jp:443)
        /bin/echo "server1.keyのパスフレーズ"
        ;;
    www2.example.jp:8443)
        /bin/echo "server2.keyのパスフレーズ"
        ;;
esac
exit 0
http://d.hatena.ne.jp/learn/20110125/p1

サンプル例はシェルスクリプトだけど、ruby , python で書けるので楽ですね。

パスフレーズを解除した鍵を作る方法

パスワード入力スクリプトを使えば、パスフレーズなしの鍵は不要ですが、念のため作り方をメモしておきます。

openssl rsa -in server.key > server.no_passphrase.key