sslセキュリティをBからA+まで上げる


![SS 2017-11-03 16.36.07.png](https://qiita-image-store.s3.amazonaws.com/0/137440/e54e5180-f0c3-7a44-9011-8fcafa194288.png "SS 2017-11-03 16.36.07.png")
前回certbotを利用してSSL認証を取得した段階では、[SSL Server Test](https://www.ssllabs.com/ssltest/index.html)のセキュリティ評価はBでした。これをA+にすることが今回の目標です。

後から気づきましたが、評価基準はこちらの[SSL Server Rating Guide](https://github.com/ssllabs/research/wiki/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

```nginx.conf
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;
}
```

![SS 2017-11-03 16.45.26.png](https://qiita-image-store.s3.amazonaws.com/0/137440/38755fcb-1ade-6e7f-806d-0f1c7b1e35f9.png "SS 2017-11-03 16.45.26.png")
Forward Secrecyに関する警告文は無くなった。

単純にDHを無効化する
参考：https://www.saintsouth.net/blog/safety-of-ssl-certificate-setting-improvements-in-web-server-nginx-to-get-rankaplus-from-ssl-server-test/

```
        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になりました。
![SS 2017-11-03 16.58.57.png](https://qiita-image-store.s3.amazonaws.com/0/137440/2bfd1833-6c5d-177f-8f19-79395213031d.png "SS 2017-11-03 16.58.57.png")

```
        ssl_ciphers "ALL:!DSS:!DH";
```
この時になって前のごちゃごちゃはいらずにALLとすればいいことに気づきました。これでもAで通ります。
![SS 2017-11-03 17.44.30.png](https://qiita-image-store.s3.amazonaws.com/0/137440/f23dfafb-2925-837b-783b-9dad5dcba6d1.png "SS 2017-11-03 17.44.30.png")
ただ、2つWEAKと文句を言われるので、これを無効にします。
名前指定の参考：https://www.openssl.org/docs/manmaster/man1/ciphers.html

```
        ssl_ciphers "ALL:!IDEA:!DSS:!DH";
```


A+にするにはどうすればいいか。
![SS 2017-11-03 17.08.35.png](https://qiita-image-store.s3.amazonaws.com/0/137440/cf82a1db-1c02-21b2-c00f-7df1391d8d54.png "SS 2017-11-03 17.08.35.png")
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";
```
![SS 2017-11-03 17.35.00.png](https://qiita-image-store.s3.amazonaws.com/0/137440/8df055af-ab1c-1c5e-6888-3ac22f58f2c3.png "SS 2017-11-03 17.35.00.png")
やった！