SSL  SERVER TESTで A+の評価をとる

WebサイトのSSLの安全性の評価ツールである[SSL SERVER TEST](https://www.ssllabs.com/ssltest/)でA+の評価が取れたので、残しておきたいと思います。

## 環境
CentOS 7.5
Nginx 1.5.1
証明書はLet’s Encryptにて取得しています。
上記環境でのLet’s Encryptの証明書取得に関しては[こちら](https://qiita.com/kyo662211/items/27a3d8c94591aae7f29a)で記事にしています。

## nginxのconfファイルに追加したもの

```/etc/nginx/conf.d/***.conf
server {
  (略)
  ssl_protocols TLSv1.2;
  ssl_ciphers 'ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE- 
ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256';
  ssl_prefer_server_ciphers on;

  ssl_session_cache shared:SSL:50m;
  ssl_session_timeout 1d;

  ssl_stapling on;
  ssl_stapling_verify on;
  resolver 8.8.8.8 8.8.4.4 valid=300s;
  ssl_trusted_certificate /etc/letsencrypt/live/www.example.com/fullchain.pem;
  # www.example.comはそれぞれのドメインに変更してください。
  add_header Strict-Transport-Security 'max-age=63072000; includeSubDomains; preload;';
  (略)
}
```

| ディレクディブ | 概要 |
|:--|:--|
| ssl_protocols | SSL/TLSプロトコルを指定する |
| ssl_ciphers | 暗号化スイートリストの指定 |
| ssl_prefer_server_ciphers | サーバー側で設定した暗号化スイートリストを使用するか on/off |
| ssl_session_cache | セッションキャッシュを設定する on/off  |
| ssl_session_timeout | セッションキャッシュの有効期限を設定する  |
| ssl_stapling | OCSP Staplingを設定する on/off  |
| ssl_stapling_verify | OSCPの問い合わせ結果の検証を設定する on/off |
| resolver | 名前解決の際に利用するDNSサーバを指定する |
| ssl_trusted_certificate | OCSPの問い合わせに利用するCA証明書を指定する。 |

## 暗号化スイートリストとは
### 暗号スイート
HTTPSには鍵認証(),鍵交換(),メッセージ認証符号(),共通鍵暗号化()といったものがあり、それぞれプロトコルの選択が可能です。これの組み合わせを暗号化スイートと呼びます。
以下コマンドで確認できます。

```
$ openssl ciphers -v
ECDHE-RSA-AES256-GCM-SHA384 TLSv1.2 Kx=ECDH     Au=RSA  Enc=AESGCM(256) Mac=AEAD
ECDHE-ECDSA-AES256-GCM-SHA384 TLSv1.2 Kx=ECDH     Au=ECDSA Enc=AESGCM(256) Mac=AEAD
ECDHE-RSA-AES256-SHA384 TLSv1.2 Kx=ECDH     Au=RSA  Enc=AES(256)  Mac=SHA384
ECDHE-ECDSA-AES256-SHA384 TLSv1.2 Kx=ECDH     Au=ECDSA Enc=AES(256)  Mac=SHA384
ECDHE-RSA-AES256-SHA    SSLv3 Kx=ECDH     Au=RSA  Enc=AES(256)  Mac=SHA1
ECDHE-ECDSA-AES256-SHA  SSLv3 Kx=ECDH     Au=ECDSA Enc=AES(256)  Mac=SHA1
DH-DSS-AES256-GCM-SHA384 TLSv1.2 Kx=DH/DSS   Au=DH   Enc=AESGCM(256) Mac=AEAD
DHE-DSS-AES256-GCM-SHA384 TLSv1.2 Kx=DH       Au=DSS  Enc=AESGCM(256) Mac=AEAD
DH-RSA-AES256-GCM-SHA384 TLSv1.2 Kx=DH/RSA   Au=DH   Enc=AESGCM(256) Mac=AEAD
DHE-RSA-AES256-GCM-SHA384 TLSv1.2 Kx=DH       Au=RSA  Enc=AESGCM(256) Mac=AEAD
(略)
```

### 暗号化スイートリスト
優先度が高い順番で暗号化スイートを並べ、

## OCSP Staplingとは
### OCSP
HTTPS通信では、サーバー証明書の有効/失効を証明書失効リスト(CRL)を用いていました。しかし、失効リストの更新には即時性の点で問題があります。こちらの解決策としてOCSPではCRLでの有効性の確認の代わりにOCSPレスポンダに証明書の有効性を確認します。
### OCSP Stapling
通常はクライアントがOCSPレスポンダに問い合わせをしますが、OCSP StaplingはOCSPレスポンダからの問い合わせ結果をサーバーにキャッシュすることで、クライアントはOCSPレスポンダへの問い合わせの必要がなくなり、より短時間で証明書の有効性を確認することができます。

## おまけ
Nginxのconfigを自動生成できます。
https://nginxconfig.io/

## 参考
[OCSP Stapling](https://rms-digicert.ne.jp/howto/basis/enabling-ocsp-stapling.html)
[理解してるつもりの SSL/TLS でも、もっと理解したら面白かった話](http://tkengo.github.io/blog/2015/12/01/https-details/)
[Let’s EncryptとNginx : セキュアなWebデプロイメントの現状](https://postd.cc/secure-web-deployment-with-lets-encrypt-and-nginx/)
[NginxでHTTPS：ゼロから始めてSSLの評価をA+にするまで Part 2 – 設定、Ciphersuite、パフォーマンス](https://postd.cc/https-on-nginx-from-zero-to-a-plus-part-2-configuration-ciphersuites-and-performance/)