letsencrypt 認証更新の苦労話

自宅サーバーで,http から https にするために無料認証サイトの letsencrypt を使っている人がおられると思います.私もその一人です.私の場合,ウェブサーバーに nginx を使って,standalone モードで,letsencrypt の認証を取りました.認証期間は3ヶ月なので,3ヶ月に1回,認証の更新をしなくてはなりません.認証の更新は,

sudo certbot renew

で出来るを思っていたのですが,ここで問題が発生しました.このコマンドを実行したところ,以下のようなエラーが出ました.

Domain: xxxxxx.com
Type: unauthorized
Detail: Incorrect validation certificate for tls-sni-01 challenge.
Requested
4a81af06afba487c0919ea6fb7cd08c0.7b721688772661b46a23d5e3b9b7b666.acme.invalid
from xxx.yyy.zzz.uuu:443. Received 2 certificate(s), first
certificate had names "xxxxxx.com"

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.

ただし,このメッセージで,domain名は,xxxxxx.com,IP addressは,xxx.yyy.zzz.uuu に変更してあります.

そこで,更新のプロトコールtls-sni-01 から http-01 に変えてみました.これは,

sudo certbot renew --preferred-challenges http

で行います.すると,今度は,

http://xxxxxx.com/.well-known/acme-challenge

が見つからないと言うエラー(404)が出ました.そこで,上記に対応する directory を作りました.私の場合,HP のルートが /usr/local/www/nginx なので,

/usr/local/www/nginx/.well-known/acme-challenge

を作って,nginx.conf に,

location /.well-known/acme-challenge {
    default_type "text/plain";
    root /usr/local/www/nginx;
}

を書き足しました.しかし,その後も同じエラーが出ました.

ここで困って,

https://community.letsencrypt.org/

に助けを求めたところ,standalone の場合,あらかじめ,nginx を止めないとだめだとのこと.そこで,

sudo service nginx stop

sudo certbot renew --preferred-challenges http

sudo serivce nginx start

としたところ,見事,認証の更新に成功しました.

その後,教えてもらったのですが,

/etc/letsencrypt/renewal-hooks/pre と /etc/letsencrypt/renewal-hooks/post にそれぞれ,nginx をストップするscriptとスタートするscriptをあらかじめ作って置いておくと,自動的に nginx の操作をしてくれるそうです.

certbot は,実情を表さないエラーメッセージをだすため,いろいろ苦労しましたが,ようやく認証更新が出来るようになりました.