letsencrypt を導入して VPS 上で動いている HTTP Server を SSL化 した。 Ubuntu16.04 で Nginx 使っていたので

[https://certbot.eff.org/#ubuntuxenial-nginx]

を参考に作業をすすめる

$ sudo apt-get install letsencrypt

certbot に変わっているそうだが、いいのかな。。。

LetsEncrypt の仕組み的に、80 Port で /.well-known/acme-challenge/ に認証用のファイル をおいて、そこにアクセスすることで自動的に作業をすすめるようなので

[https://letsencrypt.github.io/acme-spec/]

Nginx の location 先を テンポラリのフォルダに設定しておく。名前は example.comですすめる。 あと、http へのアクセスは https に飛ばすのも追加しておく

server {
        listen 80;
    listen [::]:80;

        server_name example.com;

        location '/.well-known/acme-challenge' {
                default_type "text/plain";
                root         /tmp/letsencrypt;
    }

        location / {
                return 301 https://$host$request_uri;
        }
}

その後、証明書を取得する。問題がなければ、下記のようなログがでる。

$ sudo letsencrypt certonly --webroot --webroot-path /tmp/letsencrypt -d example.com

IMPORTANT NOTES:
- Congratulations! Your certificate and chain have been saved at
  /etc/letsencrypt/live/neotitans.net/fullchain.pem. Your cert will
  expire on 2016-11-18. To obtain a new version of the certificate in
  the future, simply run Let's Encrypt again.
- If you like Let's Encrypt, please consider supporting our work by:

Donating to ISRG / Let's Encrypt:   https://letsencrypt.org/donate
Donating to EFF:                    https://eff.org/donate-le

その後、https の設定を追加し、nginx をリスタートして終了

server {
       listen 443 ssl;
       listen [::]:443 ssl;

       server_name example.com;

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

あとは 90日で証明書がきれるとのことなので、更新するためのチェックとして

$ sudo letsencrypt renew --dry-run -m email@example.com --agree-tos

で、うまく動くことを確認したら、crontab とかにいれて 定期的に動かすようにすればいい。 Note に記載されていた内容に従い、

Note:

if you're setting up a cron or systemd job, we recommend running it
twice per day (it won't do anything until your certificates are due
for renewal or revoked, but running it regularly would give your
site a chance of staying online in case a Let's Encrypt-initiated
revocation happened for some reason).
Please select a random minute within the hour for your renewal tasks.

ランダムな日時を指定して renew をしかけるようにした。

オプションはいっぱいある模様。webroot ではなく standalone で nginx を一時的に止める hookの仕組みがあるようだった。

[https://certbot.eff.org/docs/using.html#renewal]