このセクションでは、SSL証明書の更新処理エラーへの対処について紹介していきます。

今回のエラーは、Nginx の Webサーバーで Let’s Encrypt から SSLサーバー証明書を更新する環境で発生しました。

証明書の自動更新が正常にいくかどうかテストすると、処理がエラーとなる。

[user@pub-web ~]$ sudo certbot renew --dry-run
Saving debug log to /var/log/letsencrypt/letsencrypt.log

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Processing /etc/letsencrypt/renewal/example.com.conf
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Simulating renewal of an existing certificate for example.com

ーー(省略)ーー
Failed to renew certificate example.com with error: Some challenges have failed.

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
All simulated renewals failed. The following certificates could not be renewed:
  /etc/letsencrypt/live/example.com/fullchain.pem (failure)
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
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.
[user@pub-web ~]$ 

[原因]
certbot を用いて認証局側の認証を行う際、認証局側は certbot クライアントのWebサイト(http://www.example.com)に対して サイト直下の /.well-known/acme-challenge/ にアクセス(GET メソッド)する処理をしているようです。/.well-known/acme-challenge/ への http でのアクセスが失敗していると、上記のエラーが発生します。

[確認]
Nginx で http のアクセスを https にリダイレクトするような処理がないかどうか確認します。http を https へリダイレクトする処理がある場合には、Webサイト直下の /.well-know/acme-challenge/ への http アクセスが正常にできていない恐れがあります。私の環境では下記のように httpsへリダイレクトする処理が入っていました。

server {
    listen 80;
    server_name example.com;
    ーー(省略)ーー
    location / {
           return 301 https://$host$request_uri;
    }

[対処]
/.well-known/acme-challenge/ へのアクセスは https へリダイレクトしないように Nginx の 設定を修正します。修正後、Nginxサービスを再起動して設定を反映します。

server {
    listen 80;
    server_name example.com;
    ーー(省略)ーー
    #### ここから
    location ^~ /.well-known/acme-challenge/ {
          default_type    "text/plain";
          root            /var/www/wordpress;
    }
    #### ここまで追加します

    location / {
         return 301 https://$host$request_uri;
    }
    ーー(

上記対処後、エラーが解消されます。万が一、エラーが解消されない場合には他の要因の可能性があります。

[user@pub-web ~]$ sudo certbot renew --dry-run
Saving debug log to /var/log/letsencrypt/letsencrypt.log

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Processing /etc/letsencrypt/renewal/example.com.conf
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Simulating renewal of an existing certificate for example.com

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Congratulations, all simulated renewals succeeded: 
  /etc/letsencrypt/live/example.com/fullchain.pem (success)
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
[user@pub-web ~]$