このssl_ciphersだとWindows+IEでRSA鍵共有が優先されてしまう問題が有ったのでobsolute
理由が記載されていない設定例しか見当たらなかったのでメモしておく。2013/9時点の理解。
Apacheでも名前の読替えで全て同じ設定が可能。
ssl_protocols SSLv3 TLSv1 TLSv1.1 TLSv1.2;ssl_ciphers AESGCM:SHA384:SHA256:@STRENGTH:RC4:HIGH:!EXP:!LOW:!MD5:!aNULL:!eNULL:!KRB5:!PSK:!SRP;ssl_prefer_server_ciphers on; ssl_stapling on; add_header Strict-Transport-Security max-age=31536000;
ssl_ciphers
- RC4 > CBC (BEASTの方が重大と考える)なら、上記の通り。
- CBC > RC4 (RC4の危殆化が重大と考える)なら
ssl_ciphers HIGH:!MD5:!aNULL:!eNULL:!EXP:!KRB5:!PSK:!SRP;
- クライアントの構成から、SSLv3とRC4を無効にできるなら、
ssl_protocols TLSv1 TLSv1.1 TLSv1.2; ssl_ciphers HIGH:!RC4:!MD5:!aNULL:!eNULL:!EXP:!KRB5:!PSK:!SRP;
ciphersの記述を細分すると、
AESGCM:SHA384:SHA256:@STRENGTH
TLSv1.2以降で導入された方式をMACでリストアップして、暗号強度順に並べている。これらに対応しているクライアントはTLSv1.2で接続しているはず。デフォルト有効ではないものの、メジャーブラウザは実装済み。 なお、
TLSv1.2:!eNULL
でも同じ結果になるはずだが、1.0.1eより前ではTLSv1.2という一括指定は使えないようだ。
RC4:HIGH:!EXP:!LOW
BEAST未対策かつTLSv1.2非対応の古いブラウザ向けにRC4-128bitを優先する。米国輸出規制対応の弱いRC4は!EXPで排除される。(64bitのRC4が実装された時のために!LOWをいれておく) RC4が無効化されていればそれ以外に128bit以上の暗号を使う。
!MD5
今のところ弱衝突はでていないが、MD5が必須なのはSSLv2以下のブラウザだけなので無効にして構わない。SHA1に非対応のブラウザは流石に無いと考えていい。
!aNULL:!eNULL:!KRB5:!PSK:!SRP
署名なし、暗号化なしは無効。また古い形式と事前共有など。使われることは無いだろうが ssl_prefer_server_ciphers on なので念のため無効にしておく
これらのルールは
openssl ciphers -v 'ciphersuites'
で利用される順序が確認できる。
ssl_session_cache
トラフィックが少ないのでワーカー毎キャッシュを無効にして、全て共有。
ssl_stapling
OCSP応答をサーバー側にキャッシュする。最初のセッション確立までの遅延を減らせる。nginxの場合、resolverを明示的に設定が必要
Strict-Transport-Security
同じくトラフィックが少ないのでブラウザにSSLの利用を強制する。