前回certbotを利用してSSL認証を取得した段階では、SSL Server Testのセキュリティ評価はBでした。これをA+にすることが今回の目標です。
後から気づきましたが、評価基準はこちらのSSL Server Rating Guideに明記されていました。80点以上でAですね。
まず、点数が低いkeyexchange parameters。Qualysの評価詳細を下まで見ていくと、Forward Secrecyが弱いことがわかりました。
そこで、PFS(Perfect Forward Secrecy)で改善できないか試します。
https://rms-digicert.ne.jp/howto/basis/Forward_Secrecy_Apache_Ngix.html
server {
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers "ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA:ECDHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES256-SHA:ECDHE-ECDSA-DES-CBC3-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:DES-CBC3-SHA:!DSS";
ssl_prefer_server_ciphers on;
}
ssl_ciphers "ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA:ECDHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES256-SHA:ECDHE-ECDSA-DES-CBC3-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:DES-CBC3-SHA:!DSS:!DH";
最後に!DHを追加しただけです。
これだけでAになりました。
ssl_ciphers "ALL:!DSS:!DH";
この時になって前のごちゃごちゃはいらずにALLとすればいいことに気づきました。これでもAで通ります。
ただ、2つWEAKと文句を言われるので、これを無効にします。
名前指定の参考:https://www.openssl.org/docs/manmaster/man1/ciphers.html
ssl_ciphers "ALL:!IDEA:!DSS:!DH";
A+にするにはどうすればいいか。
GitHub.comの評価を見てみると、評価点自体は変わらないものの、どうやら加点項目があるようです。
HPKPとHSTSを実装すれば良さそう。
HSTSはHTTPリクエストをHTTPSにしろと伝えてくれるものらしい。これを追加する。
追記:HSTSの解説: https://ja.wikipedia.org/wiki/HTTP_Strict_Transport_Security
add_header Strict-Transport-Security "max-age=31536000; includeSubdomains";