SSL証明書"Let's Encrypt"の自動更新を設定してみた!

前回投稿で、Debian9 + Apacheの環境にSSL認証設定を施してみた。その際、無料のSSL証明書Let's Encryptを用いたのだが、この証明書は「有効期限:90日」と短く、その都度証明書の更新が必要になる。

カレンダーに登録して、毎回マニュアル更新での対応も考えたが、自動更新コマンドが準備されていることがわかったので、その方法をまとめてみる。



環境

クライアントPC

  • MacOSX 10.13.4

サーバー

  • Debian9
  • Apache/2.4.25 (Debian)
  • certbot 0.10.2

サーバーへSSH接続できることを前提とする。

また、今回はroot権限でそのまま作業を行うが、セキュリティ確保の為にはroot認証は無効化することを推奨する。

サーバーの環境構築とSSH設定、root無効化などの詳細に関しては、
ConoHa VPS の Debian9 に Djangoベースのサービスデプロイしてみた!!〜その①〜
とか
SSH conf を簡単に接続する方法まとめた!
を参照

尚、当然ながら、SSH認証の設定が完了していることを前提とする。設定方法に関しては、こちらを参照

自動更新設定

冒頭に記述の通り"Let's Encrypt"の証明書有効期限は90日と短いため、定期的に更新が必要となる。裏を返すと、定期更新のための機能を備えているとも言える。

そのコマンドが

certbot renew

である。

非常に多機能且つ優秀なコマンドで、その一部を用いるだけで、90日更新の苦悩がほぼゼロになる!!

これを加味して、今回の設定作業は大きく下記2STEP

  1. certbot renewコマンドの準備
  2. Linuxのcrontabに登録


Step1. certbot renewコマンドの準備

利用するオプション:
--rsa-key-size : 認証鍵のサイズをデフォルトの2048bitから4096bit指定とする。この結果、SSL認証設定のセキュリティ強度が上がる(=第三者評価サイトの結果が【B】→【A】へアップ!!)。詳細は、こちらを参照

その結果、以下のコマンドを実行することで証明書情報の更新作業が自動化される

# 証明書有効期限が30日未満の場合、RSA:4096bitサイズの認証鍵で証明書を更新
$ certbot renew --rsa-key-size 4096

これで、認証情報を自動更新するコマンドが準備できた。

<ポイント>
勘違い防止のために説明すると、このステップは、SSL証明書の有効期限を確認して有効期限が30日未満の場合、"Let's Encrypt"サービスから新しいSSL証明書取得する部分を自動化したに過ぎない。

このコマンドを実行するタイミングは、「まだ手動のまま!!」である。よって次の手順でこのコマンドをLinuxシステムにスケジュール登録して、一定タイミングで実行されるようにする。

Step2. まずは登録前のテスト

ここからは、Linux Debianにcertbot renewコマンドをスケジュール登録して、SSL証明書更新の完全自動化を目指す!

まず以下の--dry-runオプションを使って自動更新をテストしてみる。このオプションでは、証明書は更新されずに動作確認のみ実施されるため、証明書の取得回数制限に引っかかる心配もない。詳細説明はこちら

$ /usr/bin/certbot renew --dry-run

この結果、下記のようなメッセージが出力されれば、入力したコマンドをcrontab登録しても同等の結果が得られる

ちなみに以下のメッセージでわかったことだが、RSA認証鍵サイズは既存のものを継承するらしい!!(12行目くらいに「4096bit」ってあることがわかる)事前の設定で、評価を【B】→【A】へ格上げするために、2048bitサイズを4096bitサイズへ更新したが、毎回--rsa-key-sizeオプションの付与が作業必要と考えていたが、この結果から、不要であることが判明!!

やっぱりデバック大事!!



Saving debug log to /var/log/letsencrypt/letsencrypt.log

-------------------------------------------------------------------------------
Processing /etc/letsencrypt/renewal/hogehoge.net.conf
-------------------------------------------------------------------------------
Cert not due for renewal, but simulating renewal for dry run
Renewing an existing certificate
Performing the following challenges:
http-01 challenge for hogehoge.net
Waiting for verification...
Cleaning up challenges
Generating key (4096 bits): /etc/letsencrypt/keys/0002_key-certbot.pem
Creating CSR: /etc/letsencrypt/csr/0002_csr-certbot.pem
** DRY RUN: simulating 'certbot renew' close to cert expiry
**          (The test certificates below have not been saved.)

Congratulations, all renewals succeeded. The following certs have been renewed:
  /etc/letsencrypt/live/360scene.net/fullchain.pem (success)
** DRY RUN: simulating 'certbot renew' close to cert expiry
**          (The test certificates above have not been saved.)

IMPORTANT NOTES:
 - 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.

<補足:証明書取得回数制限について>
"Let's Encrypt"では、証明書の取得回数に制限を設けている
詳細に関しては、公式サイト日本語翻訳サイトを参照

証明書を更新したら、WEBサーバーの再起動も必須!

/usr/sbin/service apache2 restart

今回servieコマンドはプルパスで指定する必要があるので、注意!!



Step.3: Linuxのcrontab登録

事前チェックが成功したので、いよいよ登録!

Linux標準のcrontabの使い方については、こちらを参考にした

OSの設定状況を確認しながら、登録まで行う

まずcronへの登録状況を確認

$ crontab -l
no crontab for root

まだ何も登録されていない

次にcrontabへ設定を登録するための準備。
下記コマンドで、編集エディタを選択。【1】のnanoを推奨していることがわかるので、「1」を選択

$ crontab -e
1. /bin/nano        <---- easiest
2. /usr/bin/vim.tiny

Choose 1-2 [1]:1

設定ファイルが表示されるので、

  • スケジュールリングのタイミング
  • 実行するコマンド

を記述。記述方法は、先ほどのサイトを参照

# 毎月1日午前3時に、
# "root"ユーザが "/usr/bin/certbot renew"を実行
# "&&"で処理を連結
# WEBサーバー"apache"を再起動
00 03 01 * * root /usr/bin/certbot renew && /usr/sbin/service apache2 restart

念のために確認。下記が表示されるので登録完了!

$ crontab -l
…
<省略>
…
00 03 01 * * root /usr/bin/certbot renew && /usr/sbin/service apache2 restart

完了!

これで証明書更新のタイミングを気にする必要がない!!