Let's Encrypt の証明書更新に苦戦した記録


記事内容

Django製のWebサイトのSSL証明書をLet's Encryptのお世話になっていたのですが、この度初めて3ヶ月経過して有効期限が切れるとの通知メールをいただき、その際に更新に苦戦した記録を残しておきたいと思います。

自動更新を実装しようとした。
そのためにcertbotをインストールした。
以下の証明書更新のコマンドを実行したらエラーが出た。

sudo certbot renew

エラーは以下のような内容。

Certificate did not match expected hostname: acme-v02.api.letsencrypt.org.

ホスト名が違う、とのこと。

certbotのコンフィグファイルを覗いてみた。

sudo vim /etc/letsencrypt/renewal/(自分のサイトのドメイン名).conf

すると確かに以下のようになっていた。

server = https://acme-v02.api.letsencrypt.org/directory

これを以下のように修正した。

server = https://acme-staging-v02.api.letsencrypt.org/directory

再度、証明書更新のコマンド を実行してみた。

sudo certbot renew

すると今度は以下のエラーが出た。

Account at /etc/letsencrypt/accounts/acme-staging.api.letsencrypt.org/directory/(ランダム文字列のアカウント名) does not exist. Skipping.

色々ググってみると、アカウント情報を保存しているディレクトリがあることを知り、以下のディレクトリにlsコマンドを実行してみたところ、2つのディレクトリが存在していた。

sudo ls /etc/letsencrypt/accounts/

以下が結果です。つまり、どこかのタイミングで新たなアカウントが作成され、それは今までの接続していたのとは別のドメイン名(-stagingがつく)だということがわかりました。

acme-staging-v02.api.letsencrypt.org  acme-v02.api.letsencrypt.org

さらに-stagingがつく方のディレクトリに保存されているアカウント名を確認すると、確かにエラー通り、コンフィグファイルに記載しているものとは違うランダム文字列でした。

sudo ls /etc/letsencrypt/accounts/acme-staging-v02.api.letsencrypt.org/directory/

ここで今使えるアカウント名がわかったので、コンフィグファイル内で以下のように修正しました。

account = (新たに得たランダム文字列のアカウント名)

これで再度証明書更新のコマンドを実行してみました。

sudo certbot renew

すると今度は以下のエラーが出た。

Attempting to renew cert (自分のWebサイトのドメイン) from /etc/letsencrypt/renewal/(自分のWebサイトのドメイン).conf produced an unexpected error: You've asked to renew/replace a seemingly valid certificate with a test certificate (domains: (自分のWebサイトのドメイン)). We will not do that unless you use the --break-my-certs flag!. Skipping.

どうやら、さっきテスト証明書で更新しようとしたからダメと怒られているようです。コマンドのオプションとして --break-my-certs をつければOKとのことなので、その通りに実行してみました。

sudo certbot renew --break-my-certs

すると、うまくいきました。以下の結果が返ってきました。

Congratulations, all renewals succeeded. The following certs have been renewed:
/etc/letsencrypt/live/(自分のWebサイトのドメイン)/fullchain.pem (success)

ここまで至るのに4時間くらいかかりました。全く知識不足でした。すぐ忘れてしまわないように、このように記録に残しています。