HOME Tech Memo FastCopy IP Messenger

nsdでの letsencryptワイルドカード証明書の自動更新

リスト 白水啓章
作成 2020/03/08
更新 2020/03/14

概要

nsdのTXTレコード情報の動的更新スクリプトを使い、letsencryptのワイルドカード証明書を自動更新します。
(下記では "*.ipmsg.org" と "ipmsg.org" の2つを1つの証明書ファイルとして更新する方法を説明しています)

準備

https://github.com/shirouzu/nsd-upd の下記2ファイルを /etc/nsd に置き、chmod 755 しておきます。

  1. nsd-upd.py(動的TXTレコード更新)
  2. nsd-reload.py(検査&リロード)
  3. 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ワイルドカード証明書の自動更新」 設定が終わりました。


説明の前提

  1. (debianベース、systemd ではなく sysvinit環境)
  2. nsd は /etc/nsd に設定、ゾーンファイルは /etc/nsd/zones/配下
  3. letsencrypt は/etc/letsencrypt に設定
  4. /usr/bin/python3 が存在(nsd-upd.py, nsd-reload.py の先頭行)
  5. nsd-control, nsd-checkconfにパスが通っている(nsd-reload.pyから利用)
  6. certbot にパスが通っている(cert_update.shから利用)

参考

Let's Encryptの設定メモ(中村実さん)
nsd-upd(nsdの動的更新スクリプト)
チャンレジのタイプ(LetsEncryptの公式サイト)

独り言

  1. nsdは軽い&扱いやすくて良いですね。(bind比)
  2. この設定のおかげで、2020/3/4にletsencryptから「発行プロセスに問題があったので24時間以内に証明書を無効化します」という案内が届いたとき、cert_update.shを手動実行するだけで対応が終わりました。(cert_update.sh から --keep-until-expiringだけ抜いて実行)