読者です 読者をやめる 読者になる 読者になる

Let's Encrypt の証明書を取得して nginx を SSL 化して HTTP/2 に対応する

Ubuntu 16.04 で certbot の公式サイト を参考に Let's Encript の証明書を取得して nginx で SSL の設定をする。また、cron で証明書の更新を自動化する。ついでに HTTP/2 にも対応する。

証明書の取得

まず certbot をインストールする。

$ sudo apt-get install letsencrypt -y

証明書を取得する前に Web サーバーを止めておく。

$ sudo service nginx stop 

証明書を取得する。

$ sudo letsencrypt certonly --standalone -d ttanimichi.com -d www.ttanimichi.com

証明書と秘密鍵はそれぞれ以下の場所に配置される。

# 証明書
/etc/letsencrypt/live/ttanimichi.com/fullchain.pem
# 秘密鍵
/etc/letsencrypt/live/ttanimichi.com/privkey.pem

certbot のログは /var/log/letsencrypt/letsencrypt.log にある。

$ sudo cat /var/log/letsencrypt/letsencrypt.log

nginx の SSL 化

Let's Encrypt の証明書と秘密鍵を nginx の ssl_certificatessl_certificate_key に指定する。

# /etc/nginx/nginx.conf

    server {
        listen 443 ssl default_server;
        server_name ttanimichi.com;
        root /var/www/html/ttanimichi.com/public;

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

        ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
        ssl_prefer_server_ciphers on;
    }

Web サーバーを起動。

$ sudo service nginx start

証明書の更新

証明書の更新は letsencrypt renew でできる。

$ sudo su
# /usr/bin/letsencrypt renew > /var/log/letsencrypt/renew.log
# exit

更新した際のログは /var/log/letsencrypt/renew.log に吐くことにした。

証明書の更新を cron で自動化する

Let's Encrypt の証明書は90日で有効期限が切れてしまうので cron で更新を自動化する。

sudo crontab -e

以下の一行を追記。

30 2 * * * /usr/bin/letsencrypt renew >> /var/log/letsencrypt/renew.log 2>&1

HTTP/2 に対応する

既に SSL 化が済んでいる場合、HTTP/2 に対応するには以下のように nginx の設定ファイルを一行書き換えるだけで良い。

- listen 443 ssl default_server;
+ listen 443 ssl http2 default_server;

Web サーバーを再起動。

$ sudo service nginx start

環境

$ cat /etc/lsb-release
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=16.04
DISTRIB_CODENAME=xenial
DISTRIB_DESCRIPTION="Ubuntu 16.04.1 LTS"
$ cat /proc/version
Linux version 4.4.0-36-generic (buildd@lcy01-01) (gcc version 5.4.0 20160609 (Ubuntu 5.4.0-6ubuntu1~16.04.2) ) #55-Ubuntu SMP Thu Aug 11 18:01:55 UTC 2016
$ nginx -v
nginx version: nginx/1.10.1
$ sudo letsencrypt --version
letsencrypt 0.4.1