無償SSL署名書(Let’s Encrypt)で自動更新で失敗

無償SSL署名書のLet’s Encryptで自動更新で失敗していました。ログを確認すると以下のようなエラーとなっていました

$ sudo view /var/log/letsencrypt/letsencrypt.log
Certbot failed to authenticate some domains (authenticator: webroot). The Certificate Authority reported these problems:
  Domain: example.com
  Type:   unauthorized
  Detail: x.x.x.x: Invalid response from http://example.com/.well-known/acme-challenge/xxxxxxxxxxxxx: 404

# -------- 省略 --------

2024-07-01 04:07:57,560:DEBUG:certbot._internal.error_handler:Calling registered functions
2024-07-01 04:07:57,560:INFO:certbot._internal.auth_handler:Cleaning up challenges
2024-07-01 04:07:57,560:DEBUG:certbot._internal.plugins.webroot:Removing /var/www/example/.well-known/acme-challenge/xxxxxxxxxxxxx
2024-07-01 04:07:57,560:DEBUG:certbot._internal.plugins.webroot:All challenges cleaned up
2024-07-01 04:07:57,561:ERROR:certbot._internal.renewal:Failed to renew certificate example.com with error: Some challenges have failed.

ログではファイル認証のファイルが失敗して、404のエラーコードが返ってきてSSL証明書の更新に失敗してようなログです

失敗したドメインですが、ドキュメントルートを少し前に変更したのを思い出しました。新旧のドキュメントルート配下となります

  • 古いドキュメントルート:/var/www/example/
  • 新しいドキュメントルート:/var/www/vhost/example/

Let’s Encryptの設定ファイル(/etc/letsencrypt/renewal/ドメイン名.conf)を確認するとやはり古いドキュメントルートになっていました。

  • webroot_path = /var/www/example.com/,
  • example.com = /var/www/xample.com/
$ cat /etc/letsencrypt/renewal/example.com.conf 
# renew_before_expiry = 30 days
version = 2.11.0
archive_dir = /etc/letsencrypt/archive/example.com
cert = /etc/letsencrypt/live/example.com/cert.pem
privkey = /etc/letsencrypt/live/example.com/privkey.pem
chain = /etc/letsencrypt/live/example.com/chain.pem
fullchain = /etc/letsencrypt/live/example.com/fullchain.pem

# Options used in the renewal process
[renewalparams]
account = a4b14675036cfd80f6202c969e5630c4
authenticator = webroot
webroot_path = /var/www/example.com/,
server = https://acme-v02.api.letsencrypt.org/directory
key_type = rsa
[[webroot_map]]
example.com = /var/www/xample.com/

新しいドキュメントルートに変更すれば、Let’s Encryptで更新ができるはずです。古いドキュメントルートを新しいドキュメントルートに変更し、証明書を更新したところ、問題なく新しい証明書が発行されました。

以下の手順で設定ファイルを修正し、証明書を更新しました。

$ sudo vim /etc/letsencrypt/renewal/example.com.conf 
# 修正箇所
webroot_path = /var/www/vhost/example.com/,
example.com = /var/www/vhost/xample.com/

# 証明書を更新
$ sudo certbot renew

# Webサーバーを再起動
$ sudo systemctl restart httpd