みなさんが大好きなトラブル報告の回です。
独自にサーバーを立てて、webサイトを公開している場合、自分でメンテナンスをしなければいけません。
ましてや昨今では、http://~~という非セキュアなwebサイトは基本的に排除される勢いでの否定をされるので、
https://~~のTLSセキュリティ化しなければいけません。
まあ、多くの場合が、
Let'sEncriptサービスを使っていると思うので、無料で利用はできるのですが、3ヶ月毎に更新をしなければいけないので、cronバッチにて、自動更新する処理をしている人も多いでしょう。
Let'sEncryptからのメール
かくゆう自分も自動更新している派なんですが、珍しくLet'sEncriptからメールが届きまして、次のような内容でした。
Hello,
Your certificate (or certificates) for the names listed below will expire in 6 days (on 2023-10-04). 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.
わかりやすく訳すと、
おい、お前
証明書が切れる6日前やで!ちゃんと更新せんかいボケ!
ウチらのサービスは、90日ごとに更新せんといかんのやで。でもな、30日前からやないと更新できないから注意しいや!
詳しくはホームページみといて。
自動更新しているのに、このメールが届くということは、何やら更新が失敗した証拠だということは、即座に理解できました。
サーバーで手動更新作業
仕事の合間に、少し時間があったので、Let'sEncrypt証明書の自動更新が失敗したサーバーにログインして、手動で更新コマンドを実行してみることにしました。
すると・・・
$ sudo certbot renew
Saving debug log to /var/log/letsencrypt/letsencrypt.log
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Processing /etc/letsencrypt/renewal/example.com.conf
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Cert is due for renewal, auto-renewing...
Plugins selected: Authenticator webroot, Installer None
Renewing an existing certificate
Performing the following challenges:
http-01 challenge for example.com
Waiting for verification...
Cleaning up challenges
Attempting to renew cert (example.com) from /etc/letsencrypt/renewal/example.com.conf produced an unexpected error: Failed authorization procedure. example.com (http-01): urn:ietf:params:acme:error:unauthorized :: The client lacks sufficient authorization :: 192.168.1.1: Invalid response from https://example/.well-known/acme-challenge/tUX5u-WQKvqKjVPnpqTADnEuhM3Qy7MtE-XLQKLk2xc: 404. Skipping.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
The following certs are not due for renewal yet:
/etc/letsencrypt/live/example.com/fullchain.pem (failure)
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
1 renew failure(s), 0 parse failure(s)
IMPORTANT NOTES:
- The following errors were reported by the server:
Domain: example.com
Type: unauthorized
Detail: 192.168.1.1: Invalid response from
https://example.com/.well-known/acme-challenge/tUX5u-WQKvqKjVPnpqTADnEuhM3Qy7MtE-XLQKLk2xc:
404
To fix these errors, please make sure that your domain name was
entered correctly and the DNS A/AAAA record(s) for that domain
contain(s) the right IP address.
```
※example.comは、対象のドメインを変換しています。
※IPアドレスは、 192.168.1.1に変換しています。
ふむふむ、なるほどなるほど、あれがこーなって、そうなっているワケね・・・
って、なんやねんこれ、ワケわからんやんけ!
とにかく失敗しているということだけはわかる。
解決編
でも、このエラー良く見ていると、ポイントは、以下の場所にあるみたいだとわかった。
Domain: example.com
Type: unauthorized
Detail: 192.168.1.1: Invalid response from
https://example.com/.well-known/acme-challenge/tUX5u-WQKvqKjVPnpqTADnEuhM3Qy7MtE-XLQKLk2xc:
404
公開サーバーで、
https://example.com/.well-known/acme-challenge/tUX5u-WQKvqKjVPnpqTADnEuhM3Qy7MtE-XLQKLk2xc
というリンクが404(Not foundでアクセスできないよ)エラーになっているらしい。
ん?そんなファイル置いてないぞ?!
あ、そうか!Let'sEncryptって、対象のサイトに更新時に自動的にファイルを作って、それが正常に公開されるかということで、公開サーバーを担保しているというチェックがはいるんだった!
んでもって、このファイルにアクセスできないのはなんで????
あ、以前.git対応でやった、.(ドット)から始まるファイルへのアクセスを禁止していたんだった!
その時書いたブログ:
Repo Lookout Reporterからのメール
この時に、.gitだけじゃなくて、.(ドット)から始まるファイル(フォルダ)へのアクセスを全て断ち切っていたのを思い出しました。
先程のURLを良く眺めると、~~/.well-known/~~と、.(ドット)付きのファイルにアクセスしようとしてコケているようだ。
というわけで、Nginxを書き直して、無事にLet'sEncryptが正常更新できるようになったとさ。
あとがき
ちょうど三ヶ月前にやった操作での不具合報告という結果になり、思い出すのに時間がかかりましたが、三ヶ月前にはこんな事が起きるとは思いも寄りませんでした。
でも、こういうのサーバー運用であるあるだよな〜と思って、お客さんのサービスで使わなくてよかった!と胸をなでおろした今日の自分でした。
また同じエラーが出た時は、この記事で思い出すんだろうな〜という思い出未来の自分への手紙的な今日のブログでした。
0 件のコメント:
コメントを投稿