とある学会で支部のウェブサーバの管理を任されました。しかしサーバの管理権限だけがあり DNS の管理権限はありません。それでも HTTPS のサーバ証明書の管理は DNS-01 チャレンジを用いて自分でやりたい。ということで以下のように実現させました。(ドメイン名は example.jp に置き換えています)
example.jp の権威サーバから以下の委任を行なってもらいました。(アンダースコア等これで正しいのでこの通り設定してくださいと念押しの依頼をしました)
authority: _acme-challenge.www.example.jp. 600 NS acme-challenge.www.example.jp additional: acme-challenge.www.example.jp. 600 A 192.0.2.2
acme-challenge.www.example.jp は www.example.jp と同じサーバです。そこに _acme-challenge.www.example.jp ゾーンを作成してあり、SOA の応答は以下のようになっています。
answer: _acme-challenge.www.example.jp. 120 SOA acme-challenge.www.example.jp admin.example.jp 2022061501 600 100 86400 120 authority: _acme-challenge.www.example.jp. 120 NS acme-challenge.www.example.jp.
実は別なドメインではサーバ名も _acme-challenge.www.example.jp としていて、それでも問題なく Let's Encrypt の DNS-01 チャレンジは動いているのですが、学会の体面でホスト名に _ を使うのは不味かろうと思って今回の設定を試みた次第です。
ここでミソなのは委任の Additional A がグルーではないということです。example.jp ゾーンにおいて権威のある A レコードなのです。これは example.jp の内部名 (in-bailiwick) ですが in-domain でも sibling domain でもないようです。内部名の定義を再検討してもらうとよいかもしれませんね。
さて、あとは certbot の設定ですが djbdns の tinydns をインストールして以下のスクリプトで問題なく動作しました。(エラー処理省略)
tinydns 簡単で良いですね!
lets.sh
#!/bin/sh /usr/local/bin/certbot certonly --agree-tos --manual -d 'www.example.jp' -m admin@example.jp --preferred-challenges dns-01 --manual-public-ip-logging-ok --manual-auth-hook /root/dns01hook.sh --manual-cleanup-hook /root/dns01hookclean.sh --renew-by-default
dns01hook.sh
#!/bin/sh echo "'_acme-challenge.office.ipsj-tokai.jp:$CERTBOT_VALIDATION:60" >> /var/tinydns/root/data make -C /var/tinydns/root/
dns01hookclean.sh
#!/bin/sh sed -i.bak -e "/^'_acme-challenge/d" /var/tinydns/root/data make -C /var/tinydns/root/
Copyright by T.Suzuki