背景

TLS証明書にLet's Encrypt のクライアント実装であるcertbotを使用している。
certbotではHTTP-01チャレンジをサポートしている。
証明書を取得したいドメインの80/tcpが利用できれば発行できる。

某サーバーにおいて、普段は80/tcpを使用していないのでファイアーウォールを閉じているが、使用する時だけ80/tcpを許可する。

Let's Encrypt のクライアントとして certbotを使用している。
certbot の pre-hook と post-hook でファイアーウォールを操作する。

なお、証明書更新した後にサービスを再起動するという動作もこれを応用して実現できる。

証明書を更新した際、Nextcloudに通知を送る実装を行う。予めOSの通知をNextcloudに送るが必要。

実装

それぞれスクリプトを書く

sudo vi /etc/letsencrypt/renewal-hooks/pre/ufw.sh
#!/bin/bash
ufw allow 80/tcp
sudo vi /etc/letsencrypt/renewal-hooks/post/ufw.sh
#!/bin/bash
ufw delete allow 80/tcp
sudo vi /etc/letsencrypt/renewal-hooks/deploy/notification_nextcloud.sh
#!/bin/bash
/root/sh/nextcloud_notification.sh "certbot renewed $RENEWED_DOMAINS"

それぞれに実行権限を与える

sudo chmod +x /etc/letsencrypt/renewal-hooks/pre/ufw.sh
sudo chmod +x /etc/letsencrypt/renewal-hooks/post/ufw.sh
sudo chmod +x /etc/letsencrypt/renewal-hooks/deploy/notification_nextcloud.sh

確認

動作は下記コマンドで確認できる。

sudo certbot renew --dry-run

下記のような出力があれば、ファイアーウォールは開いて閉じるという動作をしている。

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Hook 'pre-hook' ran with output:
 Rule added
 Rule added (v6)
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Hook 'post-hook' ran with output:
 Rule deleted
 Rule deleted (v6)