1. 概要
2024年10月31日から、発生していたのに、今日、気づいたのです。
あと半月で、証明書の有効期限が切れるところだったので、危ういところでした(2024年11月15日)。
本ページは、下記のサイトを参考にさせていただきました。
「Let’s Encrypt 証明書取得時に「Problem binding to port 80: Could not bind to IPv4 or IPv6.」発生時の対処法」
「Domain with A record and no AAAA record fails to validate...」
2. 状況
「crontab」に登録して、1日1回、証明書の有効期限をチェックして、期限が近付いているときには更新するようにしています。
そのチェックスクリプトで、期限切れが近いのを検出して、再発行しようとするときにエラーになります。
スクリプトの内容は。
#!/bin/sh
export CRYPTOGRAPHY_OPENSSL_NO_LEGACY=1
/usr/local/bin/certbot \
renew \
--standalone \
--pre-hook "/usr/local/etc/rc.d/apache24 stop" \
--post-hook "/usr/local/etc/rc.d/apache24 start"
実行時に。
Saving debug log to /var/log/letsencrypt/letsencrypt.log
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Processing /usr/local/etc/letsencrypt/renewal/freebsd.sing.ne.jp.conf
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Certificate not yet due for renewal
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Processing /usr/local/etc/letsencrypt/renewal/freebsdnt.sing.ne.jp.conf
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Hook 'pre-hook' ran with output:
Stopping apache24.
Waiting for PIDS: 82749.
Renewing an existing certificate for freebsdnt.sing.ne.jp
Certbot failed to authenticate some domains (authenticator: standalone). The Certificate Authority reported these problems:
Domain: freebsdnt.sing.ne.jp
Type: dns
Detail: DNS problem: NXDOMAIN looking up A for freebsdnt.sing.ne.jp - check that a DNS record exists for this domain; DNS problem: NXDOMAIN looking up AAAA for freebsdnt.sing.ne.jp - check that a DNS record exists for this domain
Hint: The Certificate Authority failed to download the challenge files from the temporary standalone webserver started by Certbot on port 80. Ensure that the listed domains point to this machine and that it can accept inbound connections from the internet.
Failed to renew certificate freebsdnt.sing.ne.jp with error: Some challenges have failed.
・・・ 略 ・・・
Hook 'post-hook' ran with output:
Performing sanity check on apache24 configuration:
Starting apache24.
Hook 'post-hook' ran with error output:
Syntax OK
1 renew failure(s), 0 parse failure(s)
Ask for help or search for solutions at https://community.letsencrypt.org. See the logfile /var/log/letsencrypt/letsencrypt.log or re-run Certbot with -v for more details.
てなことになります。
「DNS」の登録に、「AAAA」のレコードがないと言うておるらしい。
調べると、「AAAA」というのは、「IPv6」のドメイン定義らしい。
あわてて、「IPv6」のことを調べたりしていますが。
そもそも、このサイト、「IPv4」で運用しているし、「IPv6」は契約していない。
3. 応急処置
参考サイトをもとに、インタラクティブに処理すればなんとかなりそうだったので、やってみるす。
certbot certonly --register-unsafely-without-email --standalone -d freebsd.sing.ne.jp
Saving debug log to /var/log/letsencrypt/letsencrypt.log
Certificate not yet due for renewal
You have an existing certificate that has exactly the same domains or certificate name you requested and isn't close to expiry.
(ref: /usr/local/etc/letsencrypt/renewal/freebsd.sing.ne.jp.conf)
What would you like to do?
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
1: Keep the existing certificate for now
2: Renew & replace the certificate (may be subject to CA rate limits)
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Select the appropriate number [1-2] then [enter] (press 'c' to cancel):
ここで、更新なので 2 Enter。
Renewing an existing certificate for freebsd.sing.ne.jp
Successfully received certificate.
Certificate is saved at: /usr/local/etc/letsencrypt/live/freebsd.sing.ne.jp/fullchain.pem
Key is saved at: /usr/local/etc/letsencrypt/live/freebsd.sing.ne.jp/privkey.pem
This certificate expires on 2025-02-13.
These files will be updated when the certificate renews.
NEXT STEPS:
- The certificate will need to be renewed before it expires. Certbot can automatically renew the certificate in the background, but you may need to take steps to enable that functionality. See https://certbot.org/renewal-setup for instructions.
この後ろは、略しますが。
これで、とりあえず、今回はなんとか更新しましたが・・・。
次回までになんとかしなきゃね。
4. 検討
ここで、「Domain with A record and no AAAA record fails to validate...」のサイトを読んで。
When making outbound domain validation requests for a domain that has both IPv4 and IPv6 addresses (e.g. both A and AAAA records) Let’s Encrypt will always prefer the IPv6 addresses for the initial connection. If the IPv6 connection fails at the network level (e.g. there is a timeout) and there are IPv4 addresses available then we will retry the request with one of the IPv4 addresses.
(emphasis added) This phrasing strongly suggests that having an AAAA record is not required, just as I initially expected, and yet if tere is none Certbot fails. So in the end this does look like just a plain bug.
これを「Google」大先生に訳していただくと。
Pv4 アドレスと IPv6 アドレスの両方 (例: A レコードと AAAA レコードの両方) を持つドメインに対して送信ドメイン検証リクエストを行うと、Let’s Encrypt は常に初期接続に IPv6 アドレスを優先します。IPv6 接続がネットワーク レベルで失敗し (例: タイムアウト)、IPv4 アドレスが利用できる場合は、IPv4 アドレスのいずれかを使用してリクエストを再試行します。
(強調追加) この言い回しは、当初予想したとおり、AAAA レコードは不要であることを強く示唆していますが、それでもレコードがない場合、Certbot は失敗します。したがって、結局のところ、これは単なるバグのように見えます。
となります。
単なるバグなのか?
だとすれば、納得できるんじゃがね。
5. オチ?
果たして、これがオチとなるのかどうか?
2024年11月18日、「py311-acme」「py311-certbot」等が更新されました。
手動で、更新のスクリプトを起動する限りは、エラーはなくなったように見えます。
実際に、更新が発生するのが、いつだったか覚えていませんが。
実際の更新が発生したときにエラーがなければ、完全なオチとみなしてよいかと思います。