理系学生日記

おまえはいつまで学生気分なのか

mod_ssl のディレクティブ

apt-get でインストールしたときそのままの ssl.conf の内容は少なくとも把握したいとか思ったので調べてみたのでした.

**SSLRandomSeed

|apache| SSLRandomSeed startup builtin SSLRandomSeed startup file:/dev/urandom 512 SSLRandomSeed connect builtin SSLRandomSeed connect file:/dev/urandom 512 ||<

SSLRandomSeed は PRNG への乱数の種をどうやって渡すかを指定するディレクティブのようです.startup や connect の指定は,いつその種を供給してやるかってことみたいですね.startup ってのは Apache の起動時ってことかな.connect は SSL のセッション確立時ですね.

builtin や file: の指定は,実際の種をどうやって生成するか.builtin だと,現在の時間と PID,inter process scoreboard を元に Apache 側でよしなに生成してくれる模様.CPU にはほとんど負荷がかからない代わりに,特に起動時に乱数のエントロピーが小さいとのことです.

mod_ssl - Apache HTTP Server> The drawback is that this is not really a strong source and at startup time (where the scoreboard is still not available) this source just produces a few bytes of entropy. So you should always, at least for the startup, use an additional seeding source. <<

file: はその名が示す通り,指定したファイルから種を生成します.普通は /dev/random または /dev/urandom が使われるみたいですね. /dev/random はうまいことエントロピーが得られない場合は,得られるまでブロックしてしまうことがあります.この辺は man random を見ても最初は正直意味が分からないのですが(see: http://www.linux.or.jp/JM/html/LDP_man-pages/man4/random.4.html),@IT に分かりやすい解説が載っていますので,そちらを参照するのが良さそうですね. -Linusのクリスマスプレゼントが引き起こした問題(2/2) − @IT

exec: なんて指定もできたりします.

SSLRandomSeed startup exec:/to/your/program [bytes] << bytes を指定すると,/to/your/program によって STDOUT に書き出された [bytes] byte がエントロピー生成に使われるみたいです.もちろんプログラムの起動はわりとコストがかかるので,connect に指定するのは止めときな! っていうことが mod_ssl のドキュメントには書かれてますね.

**SSLPassPhrase

|apache| SSLPassPhraseDialog builtin ||<

SSL を有効にしたサイトにおいては,Apache が証明書だの秘密鍵ファイルだのを開く必要があります.この証明書だの何なのってのは暗号化されちゃっていて,復号化するときにはパスフレーズが必要になります(オレオレ証明書とかだと,パスフレーズは空にしたりしますが).そのときにどうやってパスフレーズを Apache に教えてあげるかを指定するのがこのディレクティブになります.builtin だと手で入力しろやってことですね.

exec: でプログラムを指定してやると,そのプログラムが STDOUT に吐き出したものがパスフレーズとして使われます.

**SSLSessionCache

|apache| SSLSessionCache shmcb:/var/run/apache2/ssl_scache(512000) SSLSessionCacheTimeout 300 ||<

OpenSSL においては SSL のセッションは一般には再利用されます.最近のブラウザは並列にリクエストを飛ばしたりしますし,そういった場合には当然ながら複数のプロセスが並行してそのリクエストを処理しなければなりません.逐一 SSL のセッションを確立するのはメンドくて重いですから,こういう場合に inter-process のキャッシュを使用するということらしいですね.そのキャッシュの形態を指定するディレクティブです.threaded MPM だと必要なかったりするんでしょうか.

そもそも使わない場合は none を,使用する場合は dbm や shm で指定するみたいです.上記に指定されている shmcb ってのは Shared Memory Cyclic Buffer の略のようですが,よくわからないです.

**SSLMutex

疲れてきた.

|apache| SSLMutex file:/var/run/apache2/ssl_mutex ||<

各プロセスが同期をとるための mutex をどう作るかって指定になります.posix semaphore だったり,flock を使うことだったりを指定できますが,上記の file: の指定だと,どんな実装を選ぶかを mod_ssl がよしなに選んでくれるみたいですね.

**SSLCipherSuite

|apache| SSLCipherSuite HIGH:MEDIUM:!ADH ||<

クライアントが選ぶことのできる Cipher Suite をこのディレクティブにて指定します.HIGH とかはいくつかの指定をまとめたタグになっていたり,各種演算子があったりで分かりにくいのですが,openssl コマンドを使うとどういう指定かを理解することができます.

|tcsh| $ openssl ciphers -v 'HIGH:MEDIUM:!ADH' DHE-RSA-AES256-SHA SSLv3 Kx=DH Au=RSA Enc=AES(256) Mac=SHA1 DHE-DSS-AES256-SHA SSLv3 Kx=DH Au=DSS Enc=AES(256) Mac=SHA1 AES256-SHA SSLv3 Kx=RSA Au=RSA Enc=AES(256) Mac=SHA1 DHE-RSA-AES128-SHA SSLv3 Kx=DH Au=RSA Enc=AES(128) Mac=SHA1 DHE-DSS-AES128-SHA SSLv3 Kx=DH Au=DSS Enc=AES(128) Mac=SHA1 AES128-SHA SSLv3 Kx=RSA Au=RSA Enc=AES(128) Mac=SHA1 EDH-RSA-DES-CBC3-SHA SSLv3 Kx=DH Au=RSA Enc=3DES(168) Mac=SHA1 EDH-DSS-DES-CBC3-SHA SSLv3 Kx=DH Au=DSS Enc=3DES(168) Mac=SHA1 DES-CBC3-SHA SSLv3 Kx=RSA Au=RSA Enc=3DES(168) Mac=SHA1 DES-CBC3-MD5 SSLv2 Kx=RSA Au=RSA Enc=3DES(168) Mac=MD5 RC4-SHA SSLv3 Kx=RSA Au=RSA Enc=RC4(128) Mac=SHA1 RC4-MD5 SSLv3 Kx=RSA Au=RSA Enc=RC4(128) Mac=MD5 RC2-CBC-MD5 SSLv2 Kx=RSA Au=RSA Enc=RC2(128) Mac=MD5 RC4-MD5 SSLv2 Kx=RSA Au=RSA Enc=RC4(128) Mac=MD5 ||<

**SSLProtocol

|apache| SSLProtocol all -SSLv2 ||<

SSLProtocol は SSL/TLS のどの ver. を使うかを指定するディレクティブです.選べるのは,SSLv2,SSLv3,TLSv1 ですが,それらをまとめて ALL で指定することができます.また,'+' や '-' で特定のプロトコルを追加/削除することも可能です.