PPAリポジトリのcertbot入れてワイルドカードの証明書もやってみた。
やりたかったサイトは、
自前DNS使ってるがプライマリは公開しないで借りてるセカンダリDNSで引かせる感じにしてるんで難しいかと思ったが、
bindって同じドメインを複数のzoneに分けることってできるのね。
example.com のゾーンに _acme-challenge.example.com のNSレコードを設定する。
_acme-challenge.example.com のゾーンを作成する。
ってすると、 _acme-challenge.example.comの問い合わせの時は _acme-challenge.example.com のゾーンで応答してくれる。
セカンダリは要らないので allow-update は要らない。
certbotが書き換えるのでallow-updateが必要。
_は本来ドメイン名に認められてない文字なので check-names ignore が必要。
zone "_acme-challenge.example.com" {
type master;
file "/etc/bind/_acme-challenge.example.com";
allow-update {
127.0.0.1;
};
check-names ignore;
};
ゾーン設定はこんな感じ。
ゾーン名が完全一致しないと優先されないぽい?
最初 ns0.example.com みたいにしたらうまく行かなかった。
まあ、かなりハマったんだがDNSは即時反映しなかったりでわかりにくい。
_acme-challenge.example.com IN SOA ns0.example.com. webmaster.example.com. (
108 ; serial
86400 ; refresh (1 day)
3600 ; retry (1 hour)
86400 ; expire (1 day)
60 ; minimum (1 minute)
)
NS ns0.example.com.
ゾーンファイルの方はNSレコードだけ設定する。
これで、_acme-challenge.example.comのNSレコードを引いた時に返ってくるまで待つ。
一番ハマったのがnsupdateコマンドでの変更。
nsupdateコマンドでbindの書き換えを行う時、/etc/bind のパーミッションがないとかで怒られる。
で、このパーミッションは普通のパーミッションじゃなくてapparmorってので設定されてた。
/etc/apparmor.d/usr.sbin.named を確認して、
/etc/bind/** r,
となってるので、
/etc/bind/** rw,
にしたら更新できた。
/etc/letsencrypt/dns-01-auth.sh
#!/bin/sh
# dns-01 is VALIDATION set, TOKEN not set
[ "$CERTBOT_VALIDATION" = "" ] && exit 0
[ "$CERTBOT_TOKEN" != "" ] && exit 0
echo "delete _acme-challenge.$CERTBOT_DOMAIN TXT\n"\
"add _acme-challenge.$CERTBOT_DOMAIN 10 IN TXT \"$CERTBOT_VALIDATION\"\n" | nsupdate -l
更新用スクリプトと
/etc/letsencrypt/dns-01-clean.sh
#!/bin/sh
[ "$CERTBOT_VALIDATION" = "" ] && exit 0
[ "$CERTBOT_TOKEN" != "" ] && exit 0
echo "delete _acme-challenge.$CERTBOT_DOMAIN TXT\n" | nsupdate -l
クリーン用スクリプトを作成。
両方共実行権限をつけておく。
sudo certbot certonly -d example.com -d *.example.com -m webmaster@example.com --preferred-challenges dns-01 --server https://acme-v02.api.letsencrypt.org/directory --manual --manual-auth-hook /etc/letsencrypt/dns-01-auth.sh --manual-cleanup-hook /etc/letsencrypt/dns-01-clean.sh
を実行する。
1回[Y/N]を聞かれるのでYして、エラーが出るか作成された証明書のパスが出力される。
2回目以降は、
sudo certbot renew
で更新されるぽい。