nsdでの letsencryptワイルドカード証明書の自動更新
概要
nsdのTXTレコード情報の動的更新スクリプトを使い、letsencryptのワイルドカード証明書を自動更新します。
(下記では "*.ipmsg.org" と "ipmsg.org" の2つを1つの証明書ファイルとして更新する方法を説明しています)
準備
https://github.com/shirouzu/nsd-upd の下記2ファイルを /etc/nsd に置き、chmod 755 しておきます。
- nsd-upd.py(動的TXTレコード更新)
- nsd-reload.py(検査&リロード)
- letencrypt利用が初めての場合、certbot register -m (email-address) --agree-tos --no-eff-email を実行。
(説明の前提も参照のこと)
手順
nsd-upd.py にTXTレコードの値を自動で渡すため(--manual-auth-hookで指定)、/etc/letsencrypt/dns01-upd-txt.sh を作り chmod 0755 しておきます。
(file: /etc/letsencrypt/dns01-upd-txt.sh)
#!/bin/sh
# 最初の$CERTBOT_DOMAIN末尾の.をお忘れなく
/etc/nsd/nsd-upd.py _acme-challenge.$CERTBOT_DOMAIN. txt=$CERTBOT_VALIDATION /etc/nsd/zones/$CERTBOT_DOMAIN
DNS-01検証成功後にTXTレコードを削除するため(--manual-cleanup-hookで指定)、/etc/letsencrypt/dns01-clean-txt.sh を作り chmod 0755 しておきます。
(file: /etc/letsencrypt/dns01-clean-txt.sh)
#!/bin/sh
/etc/nsd/nsd-upd.py --del _acme-challenge.$CERTBOT_DOMAIN.\* /etc/nsd/zones/$CERTBOT_DOMAIN
証明書更新後に apache等をreloadするため(--deploy-hookで指定)、 /etc/letsencrypt/dns01-reload.sh を作り chmod 0755 しておきます。
(sysvinit用の記述ですが、必要に応じて apachctl等に変更してください)
(file: /etc/letsencrypt/dns01-reload.sh)
#!/bin/sh
/etc/init.d/apache2 reload
certbotを呼び出して更新を行う/etc/letsencrypt/cert_update.shを作ります。
(複数のドメインがある場合、証明書ファイルを1つに= -d (domain) を続ける、別ファイルに=certbotの行を並べます)
(file: /etc/letsencrypt/cert_update.sh)
#!/bin/sh
OPT='
--non-interactive
--manual-public-ip-logging-ok --manual
--preferred-challenges dns-01
--server https://acme-v02.api.letsencrypt.org/directory
--expand
--keep-until-expiring
--manual-auth-hook /etc/letsencrypt/dns01-upd-txt.sh
--manual-cleanup-hook /etc/letsencrypt/dns01-clean-txt.sh
--deploy-hook /etc/letsencrypt/dns01-reload.sh
'
certbot certonly -d ipmsg.org -d '*.ipmsg.org' $OPT
cert_update.shをcron設定します。(下記はcertbotのcron設定を書き換え)
(file: /etc/cron.d/certbot)
#!/bin/sh
#0 2 * * * root perl -e 'sleep int(rand(1800))' && certbot renew
10 2 * * * root /etc/letsencrypt/cert_update.sh
これで 「nsdでの letsencryptワイルドカード証明書の自動更新」 設定が終わりました。
説明の前提
- (debianベース、systemd ではなく sysvinit環境)
- nsd は /etc/nsd に設定、ゾーンファイルは /etc/nsd/zones/配下
- letsencrypt は/etc/letsencrypt に設定
- /usr/bin/python3 が存在(nsd-upd.py, nsd-reload.py の先頭行)
- nsd-control, nsd-checkconfにパスが通っている(nsd-reload.pyから利用)
- certbot にパスが通っている(cert_update.shから利用)
参考
Let's Encryptの設定メモ(中村実さん)
nsd-upd(nsdの動的更新スクリプト)
チャンレジのタイプ(LetsEncryptの公式サイト)
独り言
- nsdは軽い&扱いやすくて良いですね。(bind比)
- この設定のおかげで、2020/3/4にletsencryptから「発行プロセスに問題があったので24時間以内に証明書を無効化します」という案内が届いたとき、cert_update.shを手動実行するだけで対応が終わりました。(cert_update.sh から --keep-until-expiringだけ抜いて実行)