Ubuntu + nginx 上で Freenom + Let's Encrypt を使って HTTPS 化する

以前、GCE 上の CentOS + Apache にて、Freenom で独自ドメインを取り、Let's Encrypt (certbot) で HTTPS 化する方法を紹介した。

今回は同じく、Freenom で無料独自ドメインを取り、Let's Encrypt (certbot) で SSL 証明書を取得するのだが、実行基盤が Ubuntu + nginx となる。GCE ではなく OCI で行った。

目次

Freenom 独自ドメインを取得する・DNS 設定する

前回の記事と同じなので省略。

Freenom で独自ドメインを取ったら、Freenom の DNS 設定画面で、対象のサーバの Public IP への A レコードを登録する。こうすると、

という HTTP でのアクセスができるようになるはず。

Let's Encrypt でサーバ証明書を取得する

ココのやり方が、前回とは違うところ。

CentOS では certbot を Yum でインストールしたが、Ubuntu では git clonecertbot-auto を取得して作業してみる。

# root ユーザに切り替える
sudo su -

# certbot を取得する
git clone https://github.com/certbot/certbot
cd ./certbot/
./certbot-auto --help

# 次の要領で、コマンド一発でサーバ証明書を発行する
./certbot-auto certonly --webroot -w /var/www/html -d neos21-oci.ml -m neos21@gmail.com --agree-tos -n

Saving debug log to /var/log/letsencrypt/letsencrypt.log
Plugins selected: Authenticator webroot, Installer None
Obtaining a new certificate
Performing the following challenges:
http-01 challenge for neos21-oci.ml
Using the webroot path /var/www/html for all unmatched domains.
Waiting for verification...
Cleaning up challenges

IMPORTANT NOTES:
 - Congratulations! Your certificate and chain have been saved at:
   /etc/letsencrypt/live/neos21-oci.ml/fullchain.pem
   Your key file has been saved at:
   /etc/letsencrypt/live/neos21-oci.ml/privkey.pem
   Your cert will expire on 2020-11-20. To obtain a new or tweaked
   version of this certificate in the future, simply run certbot-auto
   again. To non-interactively renew *all* of your certificates, run
   "certbot-auto renew"
 - Your account credentials have been saved in your Certbot
   configuration directory at /etc/letsencrypt. You should make a
   secure backup of this folder now. This configuration directory will
   also contain certificates and private keys obtained by Certbot so
   making regular backups of this folder is ideal.
 - If you like Certbot, please consider supporting our work by:

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

certonly コマンドに -m とか --agree-tos とか -n いうオプションを付けている。コレにより、利用規約の確認を省略したり、メールアドレスの入力を省略したりできる。コマンドを一発流すだけで、証明書ファイルが生成されている。

# ちなみに -m (--email) オプションがないまま --agree-tos を書いてもダメ
# You should register before running non-interactively, or provide --agree-tos and --email <email_address> flags.

nginx 設定ファイルにサーバ証明書を読み込ませる

certbot-auto で生成された証明書関連のファイルは次の2つ。

コレを nginx の設定ファイルで読み込めるようにしていく。

$ vi /etc/nginx/conf.d/default.conf
server {
  server_name  localhost;
  listen       80;
  
  # 以下3行を追加する
  listen       443 ssl;
  ssl_certificate      /etc/letsencrypt/live/neos21-oci.ml/fullchain.pem;
  ssl_certificate_key  /etc/letsencrypt/live/neos21-oci.ml/privkey.pem;
  
  # 以下省略…
}

こんな感じで、80番ポートと443番ポートを両方開けておきつつ、443番ポートの方は ssl を指定する。そして ssl_certificate および ssl_certificate_key でサーバ証明書ファイルを指定している。

設定ができたら、設定ファイルの構文チェックを行い、nginx を再起動する。

$ nginx -t
$ systemctl restart nginx

設定ができたら、

というように、HTTPS でアクセスできることを確認する。

サーバ証明書を自動更新する

コレも以前の記事とほとんど同じ。

$ crontab -l
00 03 01 * * /root/certbot/certbot-auto renew && systemctl restart nginx

こんな cron を定義しておけば、毎月1日の深夜3時に、証明書を更新してくれる。

以上〜。