Let's Encrypt「DNS-01 challenge」の証明書を手動で更新

 Let's Encryptで証明書を発行してもう3ヶ月が経とうとしているところでLet's Encryptからメールが来ましたよ。

Hello,

Your certificate (or certificates) for the names listed below will expire in 15 days (on xx Aug xx xx:xx +0000). Please make sure to renew your certificate before then, or visitors to your web site will encounter errors.

We recommend renewing certificates automatically when they have a third of their total lifetime left. For Let's Encrypt's current 90-day certificates, that means renewing 30 days before expiration. See https://letsencrypt.org/docs/integration-guide/ for details.

*.caramelsauce.info
caramelsauce.info

 このメールの文章にある期限時刻はグリニッジ時刻で記載されているので気を付けるように。日本時刻だと記載されている時刻より9時間早い時間が期限時刻だと思われる。
 まぁ、ふつうはそんなギリギリの時間まで放置しておく人もいないだろうから気にしなくてもいいと思いますが・・・

 そして送られてきたメールの文章には「自動更新することを勧めます」と記載されているが、DNS-01チャレンジを利用した事でアタイの環境では自動更新することができる環境ではなかったことが発覚・・・

 どういうことかというと、
DNS-01チャレンジで証明書を発行した場合の更新フローを調べたところ、証明書の発行時に行ったDNSの設定(ZONE設定)の更新をしなくてはならないことが発覚しました。

まずアタイが利用している無料のDNSサービスがAPI対応していない為、既存で存在するプラグインなどを利用して自動化することができない模様。
 知識のないアタイが思いつくのはSeleniumなどを使ってブラウザの自動化プログラムを組むって感じ??
 いやいや、どんだけ時間費やすんだそれ?しかもDNSサーバ側の利用規約的にそんな事してよいのかどうかもわからん。

という事で期限までの時間もあまりないしひとまず今回は手動で証明書更新しますか・・・

目次
 ・証明書更新
 ・DNSの設定
 ・証明書更新の続き
 ・DNS設定 無駄なTXTレコードの削除
 ・総括

証明書更新

 DNS-01チャレンジをしている場合の証明書を手動で更新する場合、証明書発行時と同じコマンドを実行します。


certbot certonly --manual --preferred-challenges dns -m [管理者メールアドレス] -d "caramelsauce.info" -d "*.caramelsauce.info"
Saving debug log to /var/log/letsencrypt/letsencrypt.log
Renewing an existing certificate for caramelsauce.info and *.caramelsauce.info
// ↑↑↑ 証明書を更新しま~すといっていますね。

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Please deploy a DNS TXT record under the name:  // DNSのTXTレコードをデプロイして下さい

_acme-challenge.caramelsauce.info.

with the following value:  // 「下記の値でね」と言っています。

xxXXXxXxxXXxxXxxXxxxxXXXXXXxxXXxxxxxXXXXxxX

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Press Enter to Continue

 ここの16行目でEnterを押す前にDNSの設定に入ります。

DNSの設定

 下記の画面キャプチャはinterlinkの無料DNSサービスのZONE設定画面です。
 既に2つの値が入力されています。これは証明書発行時に設定した2つのTXTレコードです。
 入力時にはキーとなる値だけ入力しても設定登録するとその値がダブルクォーテーション「"」で括られます。


 では、新たに13行目で表示された値をTXTレコードで同じように追加しましょう。

 追加したらDNSサーバに反映させます。
 DNS反映後1分程度したら「Press Enter to Continue」で止まっているターミナルでEnterを押します。

証明書更新の続き


Please deploy a DNS TXT record under the name:  // またDNSのTXTレコードをデプロイして下さい。と

_acme-challenge.caramelsauce.info.

with the following value:

xxxxxxxXXXXxXXxXXXXXXXxxxxXxxxxxxXxxXxXxXXX

(This must be set up in addition to the previous challenges; do not remove,
replace, or undo the previous challenge tasks yet. Note that you might be
asked to create multiple distinct TXT records with the same name. This is
permitted by DNS standards.)
// ↑↑ 1つめの値をそのままにして追加してください。

Before continuing, verify the TXT record has been deployed. Depending on the DNS
provider, this may take some time, from a few seconds to multiple minutes. You can
check if it has finished deploying with aid of online tools, such as the Google
Admin Toolbox: https://toolbox.googleapps.com/apps/dig/#TXT/_acme-challenge.caramelsauce.info.
Look for one or more bolded line(s) below the line ';ANSWER'. It should show the
value(s) you've just added.
// ↑↑ googleなどのオンラインツールを使ってTXTレコードがデプロイされていることを確認してからEnterを押せ。と。

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Press Enter to Continue


 2つ目のTXTレコードが表示されるので改めて2つ目のTXTレコードを先ほどと同様にDNSサーバに反映させます。
 反映後1分ほど経過したら 「Press Enter to Continue」で止まっているターミナルでEnterを押します。


Successfully received certificate.
Certificate is saved at: /etc/letsencrypt/live/caramelsauce.info/fullchain.pem
Key is saved at:         /etc/letsencrypt/live/caramelsauce.info/privkey.pem
This certificate expires on 2021-11-xx.  // だいたい3か月後の11月xx日にこの証明書の期限が切れます。と
These files will be updated when the certificate renews.

NEXT STEPS:
- This certificate will not be renewed automatically. Autorenewal of --manual certificates requires the use of an authentication hook script (--manual-auth-hook) but one was not provided. To renew this certificate, repeat this same certbot command before the certificate's expiry date.

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
If you like Certbot, please consider supporting our work by:
 * Donating to ISRG / Let's Encrypt:   https://letsencrypt.org/donate
 * Donating to EFF:                    https://eff.org/donate-le
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

 これでほぼ更新作業は完了ですね。
でも一応必要なくなったであろう前回設定したTXTレコードはもういらないでしょう。という事で今回2つ追加したTXTレコードを残して前回設定したTXTレコードを削除してしまいましょう。

DNS設定 無駄なTXTレコードの削除

 改めてDNS設定サイトにアクセスします。

 今回追加したレコードはそのままにして前回追加した2つのレコードを削除します。

 これで証明書更新作業は完了です。

総括

 正直コマンドもわかっていればDNSのデプロイも実際は30秒で反映されていたので5分もあれば更新作業は完了しました。
 更新作業を忘れないように奇数月か偶数月の1日ごろには作業する。と決めておけばたいした作業でもないかな。と。
 都度手動更新が嫌なら自動化する為に80番ポートを開放してHTTP-01チャレンジに変更するしかないですね。今のところは・・・

 ここからはいろいろなサイトやLet's Encryptの公式サイトを見た私なりの理解です。
 (英語のドキュメントだったりするのでこれまた理解が間違っているかもしれませんのであしからず)
 2021年初めにLet's Encryptが今までのcertbotでPythonを使った更新はもう限界!!ディストリビューションの違いによる差分をPythonではまかなえない!という事なのでしょうか?
そこで、Let's Encryptは今後snapを使った自動更新を推奨します。と。

snapであればディストリビューションによる差分などが発生せずに更新の枝分かれが発生せず1パターンで更新ができるようになるのでしょう。
とはいえ、まだそのような発表をしてから時間も経ってないので情報が少ない。
さらにDNS-01チャレンジでのみワイルドカードが使用できるようになったのも2020年末あたりらしいのでDNSサーバ側の対応もまだ十分ぢゃない様な気がする。

まぁ~管理しているドメインが数十、数百あるわけぢゃないし更新作業も5分あれば終わるし、しばらくは手動で証明書更新するしかないかなぁ~。80番ポート開放するのもなんだし・・・