雑な備忘録

レベルを上げて技術で殴れる人間になりたい

Let's Encryptを導入し、nginxをTLSおよびHTTP/2化する

目次

今回の目的

  • Webサーバ(nginx)のHTTPSおよびHTTP/2化
  • Let’s Encryptの証明書自動更新

作業環境

さくらのVPS 1G
CentOS release 6.8 (Final)
nginx 1.9.5以上

新しいバージョンのnginxを導入

nginxをhttp/2化する際、1.9.5以上のバージョンを要求されます。
作業時点のyumリポジトリでは、stable versionとして1.8.2が公開されていたので、
mainline versionからより新しいバージョンを取得します。

リポジトリの編集

$ sudo vim /etc/yum.repo.d/nginx.repo
[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/mainline/rhel/$releasever/$basearch/ # この行を変更
gpgcheck=0
enabled=1

nginxのアップデート

アップデート前にnginxを停止し、yum updateを実行します。

$ sudo yum service nginx stop
Stopping nginx:                                            [  OK  ]
$ sudo yum update nginx

バージョンの確認とnginx起動

特に問題が無ければmainline版のnginxがインストールされているので、
バージョン確認の後にnginxを起動しましょう。

$ nginx -v
nginx version: nginx/1.9.15
$ sudo service nginx start
Starting nginx:                                            [  OK  ]

Let's Encryptセットアップ

Let's Encryptのインストール

Let's Encryptのファイル自体はGitHubにて公開されているので、
任意のディレクトリに移動してgit cloneを行います。
今回は /usr/local にて作業を行いました。

$ git clone https://github.com/letsencrypt/letsencrypt

git cloneが完了したら"letsencrypt"ディレクトリに移動し、
パッケージインストールのコマンドを実行します。

$ cd letsencrypt/
$ ./letsencrypt-auto --help

Let's Encryptのクライアントを実行し、証明書取得

Let's Encryptでは証明書取得の手段が複数用意されていますが、
今回はwebrootプラグインを利用して更新を行います。

$ ./letsencrypt-auto certonly --webroot --webroot-path /var/www/html -d y4shiro.net

途中でメールアドレス入力と利用規約への同意を求められるので、適宜入力していきます。
証明書取得が完了すると、下記のようなファイルが作成されます。

$ sudo tree /etc/letsencrypt
/etc/letsencrypt
├── accounts
│   └── acme-v01.api.letsencrypt.org
│       └── directory
│           └── ********
│               ├── meta.json
│               ├── private_key.json
│               └── regr.json
├── archive
│   └── y4shiro.net
│       ├── cert1.pem
│       ├── chain1.pem
│       ├── fullchain1.pem
│       ├── privkey1.pem
├── csr
│   ├── 0000_csr-certbot.pem
├── keys
│   ├── 0000_key-certbot.pem
├── live
│   └── y4shiro.net
│       ├── cert.pem -> ../../archive/y4shiro.net/cert1.pem
│       ├── chain.pem -> ../../archive/y4shiro.net/chain1.pem
│       ├── fullchain.pem -> ../../archive/y4shiro.net/fullchain1.pem
│       └── privkey.pem -> ../../archive/y4shiro.net/privkey1.pem
└── renewal
    └── y4shiro.net.conf

/etc/letsencrypt/live/y4shiro.net に証明書が発行されます。

証明書自動取得

Let's Encryptで発行される証明書は期限が90日と短いので、 自動更新を行うよう設定します。
Crontabにて "毎月1日 00:00" の更新とnginxのreloadを設定しました。

$ sudo crontab -e
00 00 01 * * /usr/local/letsencrypt/letsencrypt-auto certonly --renew-by-default --webroot -w /var/www/html -d y4shiro.net && service nginx reload

nginxの設定

発行した証明書をnginxで読み込み、HTTPSとHTTP/2化を行うためにConfigファイルを編集しましょう。
HTTPSではポート443を使用するので、事前にiptableで開放しています。

Configファイル編集

qiita.com
上記記事を参考に、Configファイルの編集を行いました。

SSLv3.0に脆弱性が発見されているので、"ssl_protocols"、"ssl_ciphers"に関しては必ず設定を行って下さい。
"ssl_dhparam"(Perfect Forward Security)に関してはお好みで。

# redirect to 443
server {
    listen 80;
    server_name y4shiro.net;
    rewrite ^ https://$server_name$request_uri? permanent;
}

# server setting
server {
    listen 443 ssl http2;
    server_name y4shiro.net;

    access_log /var/log/nginx/y4shiro.net/access.log main;
    error_log /var/log/nginx/y4shiro.net/error.log;

    ssl_certificate /etc/letsencrypt/live/y4shiro.net/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/y4shiro.net/privkey.pem;
    ssl_session_timeout 5m;
    ssl_session_cache shared:SSL:50m;
    ssl_session_tickets on;

    ssl_dhparam /etc/ssl/private/dhparam.pem

    ssl on;
    ssl_prefer_server_ciphers on;
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    ssl_ciphers AESGCM:HIGH:!aNULL:!MD5;

    ssl_stapling on;
    ssl_stapling_verify on;
    ssl_trusted_certificate /etc/letsencrypt/live/y4shiro.net/fullchain.pem;
        resolver 8.8.8.8;

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

    client_max_body_size 10M;

    location / {
        root /var/www/html;
        index index.html index.htm;
    }
}

https化の確認

nginxの再起動およびリロードを行ったのち、
Webページにアクセスしてhttps化されていることを確認してください。
以上です。

参考文献

Let's Encryptの証明書をnginxに設定してhttps化した | tsuchikazu blog 光の速さのWEBサーバー(nginx)をlet's encryptでSSL化及びHTTP/2化。ついでにセキュリティ評価をA+にする。 - Qiita