Nginx の SSL の設定はほぼデフォルトで大丈夫

Open SSL と Nginx のバージョンにもよるけど、たとえば Ubuntu 16.04 LTS だと、このへんだけやっておけば Qualys SSL Labs の評価 A を取れる。

ssl_prefer_server_ciphers on;
ssl_dhparam /etc/nginx/ssl/dhparam.pem;


Nginx 1.9.1 以降ではデフォルトの設定で脆弱性のあるプロトコルや暗号化スイートが無効になっている。

Configuring HTTPS servers - Nginx

v 1.9.1 以降の ssl_protocols の初期値はこう。

ssl_protocols TLSv1 TLSv1.1 TLSv1.2

SSL v2 や SSL v3 はデフォルトで無効になっている。あらためて ssl_protocols を指定しなくてよくなった。

ssl_ciphers は v1.0.5 からこうなってる。

ssl_ciphers HIGH:!aNULL:!MD5

!MD5 は MD5 を使う暗号化スイートを使わない、なので分かると思うけど、 HIGH!aNULL ってなんだろう?

OpenSSL の ciphers の説明 によれば、

"High" encryption cipher suites. This currently means those with key lengths larger than 128 bits, and some cipher suites with 128-bit keys.


The cipher suites offering no authentication. This is currently the anonymous DH algorithms and anonymous ECDH algorithms. These cipher suites are vulnerable to "man in the middle" attacks and so their use is discouraged. These are excluded from the DEFAULT ciphers, but included in the ALL ciphers. Be careful when building cipherlists out of lower-level primitives such as kDHE or AES as these do overlap with the aNULL ciphers. When in doubt, include !aNULL in your cipherlist.

ざっくり説明するとそれぞれ「鍵長 128bit 以上の暗号化スイートを使うよ」「認証のない暗号スイート。使わないときは !aNull を指定してね」くらいのことが書いてある(ちゃんと知りたい人はちゃんと読んでください)。

ただし ssl_prefer_server_ciphers on; をちゃんと書いておかないとサーバ側の暗号化スイートの指定が優先されないので、これを書く必要はある。

Diffie-Hellman 鍵交換のパラメータを 2048bit で作って ssl_dhparam に設定しておけば、この時点で SSL Labs で評価 A が取れる。

あとは HSTS を有効化したりすれば A+ になるんじゃないかと。