はじめに
僕は Nginx を使用した Web アプリケーションで SSL/TLS を使用する場合は、設定ファイルで ssl_protocols
を ssl_ciphers
を明記しなくてはならないと思い込んでいました。そのため、いつも Mozilla SSL Configuration Generator からディレクティブをコピペしていました。しかし、これらのディレクティブを省略しても Qualys SSL LABS SSL Server Test で高スコアを出せることが分かりました。では省略した場合にはプロトコルや暗号スイートの指定はどうなるのか、調べてみました。
省略した場合の挙動
公式ドキュメント Nginx » Configuring HTTPS servers の冒頭に答えはありました。
The directives ssl_protocols and ssl_ciphers can be used to limit connections to include only the strong versions and ciphers of SSL/TLS. By default nginx uses "ssl_protocols TLSv1 TLSv1.1 TLSv1.2" and "ssl_ciphers HIGH:!aNULL:!MD5", so configuring them explicitly is generally not needed. Note that default values of these directives were changed several times.
以下は拙訳です。
ssl_protocols ディレクティブと ssl_ciphers ディレクティブの用途は、SSL/TLS のプロトコルと暗号スイートのうち強度の高いもののみを許可することで、接続を制限することです。デフォルト値はそれぞれ ssl_protocols TLSv1 TLSv1.1 TLSv1.2 と ssl_ciphers HIGH:!aNULL:!MD5 です。これらのディレクティブを明示的に指定する必要は基本的にありません。なお、これらのデフォルト値はこれまで何度か更新されています。
つまり ssl_protocols
や ssl_ciphers
を指定せずとも、十分に安全性の高い設定となるようです。
ssl_ciphers ディレクティブのデフォルト値の意味
ちなみに ssl_ciphers HIGH:!aNULL:!MD5
はどういう意味なのでしょうか。これは OpenSSLWiki » Manual:Ciphers(1) に答えがありました。
| cipher string | 意味 |
| --- | --- | --- |
| HIGH | 強度の高い暗号スイートを使用する。具体的には鍵長が 128 bit 以上のもの。
| !aNULL | 認証のない暗号スイート (ADH や AECDH を用いるもの) を 使用しない。中間者攻撃の脆弱性があるため。 |
| !MD5 | MD5 を用いる暗号スイートを 使用しない。SLOTH 攻撃 の脆弱性が存在するため。 |
結論
- SSL Server Test のスコアや分析結果に問題なければ、
ssl_protocols
やssl_ciphers
を明示的に指定する必要は特にない。- ただし、これらのディレクティブのデフォルト値、あるいは実際にサーバ側で選択される暗号スイートは Nginx や OpenSSL のバージョンに依存するはずなので注意。