nginx サーバの SSL 安全性評価で A+ を獲得

前回の続きです。
前回は、SSL証明書を間違えて設定していた問題を解決した話でした。

ngzm.hateblo.jp

今回は、さらにSSLの安全性評価を A+ にすることが目標です。

参考サイト

SSLの安全性評価を A+ にする方法については、すでに沢山の方がブログなどで発信されていますので、まずは、今回参考にしたサイトを以下にご紹介しておきます。

設定前の評価

設定前の安全性評価は「B」でした。

f:id:ngzm:20180306152936p:plain

特に「Key Exchange」の数値が低く対策が必要な感じです。

設定内容

冒頭でご紹介したサイトを参考にしながら、自分のサイトを A+ にした設定内容を示します。

1) ssl_protocols の設定

nginx の "ssl protocols" で、"sslv3" など脆弱なプロトコルを無効にします。*1

ssl_protocols TLSv1 TLSv1.1 TLSv1.2;

2) ssl_ciphers の設定

以下の値で設定します。こちらは httpsだからというだけで安全?調べたら怖くなってきたSSLの話!? - Qiita を参考にしています。

ssl_ciphers ECDHE+RSAGCM:ECDH+AESGCM:DH+AESGCM:ECDH+AES256:DH+AES256:ECDH+AES128:DH+AES:!EXPORT:!DES:!3DES:!MD5:!DSS;
ssl_prefer_server_ciphers on;

3) ssl_dhparam 設定

DH交換鍵の設定。この鍵は、次のOpenSSLコマンドで生成します。生成に結構時間を要します。

$ openssl dhparam 2048 -out dhparam.pem

これを ssl_dhparam に設定します。

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

4) HSTS ヘッダ

このヘッダ情報は、非暗号化の http 通信を抑制するために設定します。このヘッダで 必ず SSL での接続するようにクライアントに指示します。

add_header Strict-Transport-Security 'max-age=31536000; includeSubDomains;';

設定後の評価

ここまで設定した結果、安全性評価は無事に「A+」となりました。
なんだかすっきりしました。

f:id:ngzm:20180306183410p:plain

SSLって以外に奥が深いですね。一度基礎からきちんと勉強しておく価値がありそうです。

*1:nginx v1.12 とか v1.13 など最近のバージョンでは、デフォルトで "ssl_protocols TLSv1 TLSv1.1 TLSv1.2" の状態なので、バージョンが v1.12 より新しければ、この設定は特に不要である。