それマグで!

知識はカップより、マグでゆっくり頂きます。 takuya_1stのブログ

習慣に早くから配慮した者は、 おそらく人生の実りも大きい。

Certbot を自動的に更新するタイマーを設定する。

certbotapache/nginx を殺される。

通常のCertbotだと、DNSのAレコードとHTTP(s)を使って、ドメインの確認を行う。

しかし、web サーバーを不用意にシャットダウンされるのは面倒でした。あとポート転送とかやってたりするとめんどくさいんだよなぁ。

DNS の認証をTXTレコードで行う。

これは以前やりました  → certbotの更新でCloudflareプラグインを使ってDNSの認証を楽にする - それマグで!

自動的に更新する

WEBサーバーをシャットダウン・再起動を行わずに、DNSのTXTレコードでCertbotによる証明書発行ができるたら、最後は自動化です。

systemd のタイマー機能を使う。

今回は、Cronではなくsystemd のタイマー機能を使って自動実行をしようと思います。

編集するファイル

  • 実行するスクリプトファイル /usr/local/sbin/certbot-renewal.sh
  • サービス /etc/systemd/system/certbot-renewal.service
  • タイマー /etc/systemd/system/certbot-renewal.timer
  • /lib/systemd/system/certbot.timer 既存のsystemd certbot の自動実行ジョブ

実行するジョブとして登録するファイルを準備します。

ジョブとして実行するファイルを準備しました。

複数の証明書があるので、スクリプトファイルにまとめています。

/usr/local/sbin/certbot-renewal.sh

#!/usr/bin/env bash

certbot=/home/takuya/certbot/certbot-test/bin/certbot

## cloudflare の場合
CERT_NAME=example.com-wildcard
$certbot  renew --dns-cloudflare \
  --dns-cloudflare-credentials /etc/letsencrypt/cloudflareapi.cfg \
  --cert-name $CERT_NAME


## mydns の場合
CERT_NAME=example.com-mydns
mydns=/usr/local/lib/mydns/DirectEdit-master
cmd="$certbot renew --manual --preferred-challenges=dns \
  --cert-name $CERT_NAME\
  --manual-auth-hook $mydns/txtregist.php\
  --manual-cleanup-hook $mydns/txtdelete.php\
  --manual-public-ip-logging-ok"

# echo $cmd
$cmd

systemd にタイマーサービスとして登録します。

新しくファイルを準備します。

/etc/systemd/system/certbot-renewal.service

takuya@:~$ cat  /etc/systemd/system/certbot-renewal.service
[Unit]
Description=Certbot Renewal
Type=oneshot

[Service]
ExecStart=/usr/local/sbin/certbot-renewal.sh

systemd にタイマーを準備します

新しくファイルを準備します。

/etc/systemd/system/certbot-renewal.timer

[Unit]
Description=Certbot を定期的に更新する。

[Timer]
OnBootSec=3000
OnUnitActiveSec=1w

[Install]
WantedBy=multi-user.target

もし、apt などでタイマーがすでに入っていたら止めておきます。

わたしの場合、apt でいれた古いcertbot の設定があったので止めました。

sudo systemctl disable certbot.service
sudo systemctl disable certbot.timer

apt でいれた実際のファイルは次のようになっていました。

service側

takuya@sakura:~$ cat /lib/systemd/system/certbot.service
[Unit]
Description=Certbot
Documentation=file:///usr/share/doc/python-certbot-doc/html/index.html
Documentation=https://letsencrypt.readthedocs.io/en/latest/
[Service]
Type=oneshot
ExecStart=/usr/bin/certbot -q renew
PrivateTmp=true

timer 側

takuya@sakura:~$ cat /lib/systemd/system/certbot.timer
[Unit]
Description=Run certbot twice daily

[Timer]
OnCalendar=*-*-* 00,12:00:00
RandomizedDelaySec=43200
Persistent=true

[Install]
WantedBy=timers.target

あとは登録して実行します。

手動で動かすとき。最初に1度実行して確認しておきます。

sudo systemctl start certbot-renewal.timer

タイマーを有効にする。

 sudo systemctl enable certbot-renewal.timer

これで、しばらく証明書の期限切れに悩まされなくていいですね。

まとめ

letsencrypt は 手軽に証明書が作れるけど、手軽さ故に枚数が増えすぎて管理が煩雑だった。

これらをおこなったことで、管理は楽になったし、枕を高くして寝る事ができそうです。

関連資料

Certbot 関連であれこれやった記事たちです。

参考資料

https://stevenwestmoreland.com/2017/11/renewing-certbot-certificates-using-a-systemd-timer.html