certbot に apache/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 関連であれこれやった記事たちです。
- certbotの更新でCloudflareプラグインを使ってDNSの認証を楽にする - それマグで!
- certbot がLetsEncryptのワイルドカード証明書に対応してたので作ってみた - それマグで!
- certbotで証明書をぱぱっと更新する - それマグで!
- certbot でステージング(テスト環境)用に証明書を作る - それマグで!
- Certbot で証明書を削除する。 - それマグで!
- Certbotの証明書をドメインごとではなく、ドメインを追加し複数ドメインを1枚証明書にまとめる。 - それマグで!
参考資料
https://stevenwestmoreland.com/2017/11/renewing-certbot-certificates-using-a-systemd-timer.html