SSLの評価をA+なサーバーを運用してみた話

アドベントカレンダーの初っ端ってことで、他の人と被らなそうなネタにしてみた。

大抵のページが常時SSLが当たり前になってますが、その分、SSLの設定も見直す必要です。
あるwebサービスを作ったときにせっかくだから、[SSL Server Test](https://www.ssllabs.com/ssltest/index.html)でA+評価、HTTP/2に対応したオーバースペックなサーバーを構築したときの話です。

# 環境
conoha 1GBプラン
OS : CentOS７
webサーバー : Nginx

# まずはhttpでアクセスできるようにする

最初は恒例のアップデートとNginxのインストール

```shell-session
sudo yum update
sudo yum install -y nginx
```

Nginxの起動と自動起動するように設定

```shell-session
sudo systemctl enable nginx
sudo systemctl start nginx
```

あと、ポート開放を忘れずに、

```shell-session
sudo firewall-cmd --zone=public --add-service=http --permanent
sudo firewall-cmd --zone=public --add-service=https --permanent
sudo firewall-cmd –reload
```

これでとりあえず、httpでアクセス出来るようになったはず

![スクリーンショット 2017-11-30 21.20.21.png](https://qiita-image-store.s3.amazonaws.com/0/201272/074df971-f5fb-485b-c53a-6f770c2ebd5b.png)

# httpsでアクセスできるようにする

とりあえず、[letsencrypt公式](https://letsencrypt.readthedocs.io/en/latest/using.html)に載ってるのをすべてインストールする

```shell-session
sudo yum install epel-release
sudo yum install certbot python-certbot-apache
```
証明書を取得する

```shell-session
sudo /usr/bin/certbot-auto certonly --webroot -w /usr/share/nginx/html --email info@hoge.com --debug -d example.com
```
不足パッケージがあった場合、自動でインストールしてくれるのでもう一度コマンドを実行したらいい

+ `-d example.com`　がドメイン名
+ `-w /usr/share/nginx/html`が公開するルートディレクトリ
+ `--email info@hoge.com`がメールアドレス  

は環境にあったものに書き換える。

きちんと実行できたら、 `/etc/letsencrypt/live/example.com/`に鍵が生成される。

次は、Nginxの設定を書く

```nginx
〜略〜
  listen 443 ssl;
  ssl_certificate     /etc/letsencrypt/live/example.com/fullchain.pem;
  ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
〜略〜
```
最低限の事だけ書いて
```shell-session
sudo systemctl restart nginx
```
でNginxをリスタートするとhttpsでアクセスができるようになる

# A+評価をもらうための設定

ssl_dhparam用に`dhparam.pem`を作る

```shell-session
sudo openssl dhparam -out /etc/nginx/ssl/dhparam.pem 2048
```
次は、Nginxの設定を書き換える

```nginx

   listen 443 ssl http2;
   server_name example.com;
   root /usr/share/nginx/html;
   index index.php index.html index.htm;

   ssl_certificate         /etc/letsencrypt/live/example.com/fullchain.pem;       
   ssl_certificate_key     /etc/letsencrypt/live/example.com/privkey.pem;
   ssl_trusted_certificate /etc/letsencrypt/live/example.com/fullchain.pem;

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

　　　　　　ssl_ciphers "ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128:AES256:AES:DES-CBC3-SHA:HIGH:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK";
   ssl_prefer_server_ciphers  on;
　　　　　　
   ssl_stapling on;
   ssl_stapling_verify on;
   resolver 8.8.4.4 8.8.8.8 valid=300s;
   resolver_timeout 10s;

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


   add_header Strict-Transport-Security max-age=15768000;
```
設定を書き換えたあと、Nginxをリスタート

```shell-session
sudo systemctl restart nginx
```
これで[SSL Server Test](https://www.ssllabs.com/ssltest/index.html)でA+評価の出るwebサーバーになったはず