都度DNS変更不要な、新しいACMEのDNS-PERSIST-01検証

証明書の自動発行にACMEでは、ドメイン検証が幾つか定義されています。その一つにはDNS-01チャレンジは、証明書を発行するたびに指定されたDNSレコードを作成する必要があります。

新しいDNS-PERSIST-01では一度設定すれば、それ以降証明書発行時にはDNSレコードを変更・追加する必要はありません。初回だけで済むので、ACME実行主体に以降はDNS操作の権限を与えなくてすみますね。

DNS-PERSIST-01は、Let's Encryptの記事では2026年に利用可能になると見通しの旨書かれている
letsencrypt.org

DNS-PERSIST-01

DNS-PERSIST-01の仕様は、『ACME Challenge for Persistent DNS TXT Record Validation』であり、現在WG Draftになっています。

Persistに扱うために、ACMEのアカウントとバインディングするのが特徴になっています。例えば、certbotではshow_accountコマンドでアカウント情報を確認できます。またACMEクライアントはアカウントと紐づいている秘密鍵を管理してしています。
(ここでいう秘密鍵は、サーバ証明書秘密鍵ではなく、ACME処理の文脈で登場するアカウントキーです)

$ sudo certbot show_account
Account details for server https://acme-v02.api.letsencrypt.org/directory:
  Account URL: https://acme-v02.api.letsencrypt.org/acme/acct/00000000
  Account Thumbprint: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
  Email contact: none

このアカウント情報を、DNSレコード検証時に入れ込みます。例としては以下の通りです。

```
_validation-persist.example.com. IN TXT ("authority.example;" " accounturi=https://ca.example/acct/123")
```

これにより、次回以降のDNSレコード検証が不要になります。

ただし、ACMEクライアントが管理している秘密鍵を秘匿する必要があります。

(複数サーバで共通のACMEアカウントを使うユースケースってありそうですが、秘密鍵を共有したりするんでしょうかね、、、)