Let’s Encryptのサーバー証明書期限を自動延長するには?

未分類

Let’s Encryptは無料でサーバー証明書が発行できるけど、証明書の有効期間が90日間と非常に短い

3か月ごとにサーバー証明書の更新作業が必要になると考えると荷が重いですよね。

証明書更新をすっぽかしてしまうと、当然だけど証明書エラーでサイトが表示できなくなってしまいます。

「忘れちゃいけないけど単純な作業」は自動化したいですよね。

そこで、今回はLet’s Encryptのサーバー証明書を自動的に更新する方法をまとめます。

Let’s Encryptの有効期限はなぜ短いのか?

Let’s Encryptの発行するサーバー証明書は、90日間という短い有効期限です。

有償のサーバー証明書を買うと、有効期間は1年間がほとんど。

「サーバー証明書を更新する頻度も増えてしまうので面倒!」と思ってしまいますが、それにはちゃんとした理由があります。

1つ目は、万が一、セキュリティ事故が起きたときの被害を少なくできるという点。キーが盗まれたりしても、その影響期間は最大で90日間までに抑えられます。

そして2つ目は、サーバー証明書の自動更新をしてくれる人が増えるという点。このページを見ているということは、まさしくLet’s Encryptの思惑通りです!

では、自動更新を設定してみましょう。

cronを設定

サーバー証明書の延長処理を行うcertbot renewコマンドを定期的に実行すればOK。

以下、cronを使って週に1回、サーバー証明書更新を自動実行する例です。

※本記事では、CentOS 7.2での設定手順を説明します。

  1. まず、サーバーにSSHで接続し、rootになります。
  2. ファイル /etc/cron.weekly/certbot を作成します。
# vi /etc/cron.weekly/certbot
  1. 次のようなスクリプトを入力し、保存します。
#!/bin/bash
certbot renew &> /dev/null
  1. 実行権限を付与します。
# chmod +x /etc/cron.weekly/certbot

サーバー証明書自動更新の動作確認

cronの設定が終わったら、正しく証明書更新できるか、試してみましょう。

cronが実行されるまで1週間も待てないので、以下のコマンドで直接スクリプトを実行してみます。

# /etc/cron.weekly/certbot

certbotの実行ログは /var/log/letsencrypt/letsencrypt.log に出力されます。
次のようなメッセージがログに出力されていれば、サーバー証明書の更新処理が動作していることになります。

2018-07-25 23:17:06,897:DEBUG:certbot.main:certbot version: 0.23.0
2018-07-25 23:17:06,897:DEBUG:certbot.main:Arguments: []
2018-07-25 23:17:06,897:DEBUG:certbot.main:Discovered plugins: PluginsRegistry(PluginEntryPoint#apache,PluginEntryPoint#manual,PluginEntryPoint#null,PluginEntryPoint#standalone,PluginEntryPoint#webroot)
2018-07-25 23:17:06,910:DEBUG:certbot.log:Root logging level set at 20
2018-07-25 23:17:06,910:INFO:certbot.log:Saving debug log to /var/log/letsencrypt/letsencrypt.log
2018-07-25 23:17:06,921:DEBUG:certbot.plugins.selection:Requested authenticator <certbot.cli._Default object at 0x7fc78b9d9bd0> and installer <certbot.cli._Default object at 0x7fc78b9d9bd0>
2018-07-25 23:17:06,928:INFO:certbot.renewal:Cert not yet due for renewal
2018-07-25 23:17:06,929:DEBUG:certbot.renewal:no renewal failures

「Cert not yet due for renewal」というメッセージが出ていますが、これはサーバー証明書の更新の必要がないという意味です。renewalコマンドは、30日以内に期限切れになるサーバー証明書のみ更新するので、まだ期限まで余裕があるサーバー証明書の場合に、このようなメッセージが表示されます。

期限まで30日以内のサーバー証明書の場合、次のようなメッセージが表示され、サーバー証明書が更新されます。

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

-------------------------------------------------------------------------------
Processing /etc/letsencrypt/renewal/egatech.net.conf
-------------------------------------------------------------------------------
Cert is due for renewal, auto-renewing...
Plugins selected: Authenticator webroot, Installer None
Starting new HTTPS connection (1): acme-v01.api.letsencrypt.org
Renewing an existing certificate
Performing the following challenges:
http-01 challenge for egatech.net
Waiting for verification...
Cleaning up challenges

-------------------------------------------------------------------------------
new certificate deployed without reload, fullchain is
/etc/letsencrypt/live/egatech.net/fullchain.pem
-------------------------------------------------------------------------------

-------------------------------------------------------------------------------

Congratulations, all renewals succeeded. The following certs have been renewed:
/etc/letsencrypt/live/egatech.net/fullchain.pem (success)
-------------------------------------------------------------------------------

また、certbot certificatesコマンドを実行すると、証明書の有効期限が分かります。

# certbot certificates
Saving debug log to /var/log/letsencrypt/letsencrypt.log

-------------------------------------------------------------------------------
Found the following certs:
Certificate Name: egatech.net
Domains: egatech.net
Expiry Date: 2018-09-24 14:00:41+00:00 (VALID: 60 days)
Certificate Path: /etc/letsencrypt/live/egatech.net/fullchain.pem
Private Key Path: /etc/letsencrypt/live/egatech.net/privkey.pem
-------------------------------------------------------------------------------

まとめ

certbotコマンドはサーバー証明書の更新処理までできるので本当に便利!
有償のサーバー証明書は使わなくなっちゃいますね。

コメント