Let’s Encrypt [SSL: CERTIFICATE_VERIFY_FAILED]で更新に失敗するときの対応策

開発
スポンサーリンク

[SSL: CERTIFICATE_VERIFY_FAILED]発生

Let’s Encrypt使用してます。
2021/12/02現在、certbot renewで証明書を更新しようとしたところ以下エラーで更新に失敗してしまいました。

# certbot renew
Saving debug log to /var/log/letsencrypt/letsencrypt.log

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Processing /etc/letsencrypt/renewal/サイト名.conf
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Cert is due for renewal, auto-renewing...
Plugins selected: Authenticator webroot, Installer None
Starting new HTTPS connection (1): acme-v02.api.letsencrypt.org
Attempting to renew cert (サイト名) from /etc/letsencrypt/renewal/サイト名.conf produced an unexpected error: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:765). Skipping.

どうやら、(めっちゃ簡単に言うと)2021年9月30日にLet’s Encryptのルート証明書の期限が切れてしまったことによる影響らしいです
※ 詳細は「Let’s Encrypt ルート証明書 期限切れ」などでググるとたくさんでてきます。

このまま更新できないのは困るので、更新エラーの対応策を残しておきます。

対応策について

前置き

「–preferred-chain」オプションを利用してcerbot renewをしてあげれば対応できるようです。
しかし、このオプションは「certbot 1.6」以降のバージョンで使用できるようですので、まずcertbotのバージョンを確認してみましょう。

# certbot --version
certbot 1.5.0

自分の場合、1.6以下でしたので、certbotのアップデートが必要でした。

certbotのアップデート

1.6以上の方は読み飛ばしてください。

アップデート実施

# yum update certbot -y


バージョンを確認

# certbot --version
 certbot 1.11.0

これで準備はOK !

更新

preferred-chainオプション

それでは、改めて「–preferred-chain」オプションをつけてcertbot renewをかけてみましょう。
実行コマンドは以下となります。

# certbot renew --force-renewal --preferred-chain "ISRG Root X1"

「–dry-run」オプションで確認を挟みたい場合は以下コマンドで。

# certbot renew --dry-run --force-renewal --preferred-chain "ISRG Root X1"

いずれかで無事「Congratulations, all renewals succeeded」が表示されれば成功です!

実行コマンドで更新をしたら、仕上げにapacheを再起動して反映しましょう。

# systemctl restart httpd

更新が成功したら以上となります!

トラブルシューティング

CA証明書をインストールする

自分の場合、「–preferred-chain」をつけてcertbot renewを実行してもエラーが消えませんでした。

# certbot renew --dry-run --force-renewal --preferred-chain "ISRG Root X1"
Saving debug log to /var/log/letsencrypt/letsencrypt.log

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Processing /etc/letsencrypt/renewal/サイト名.conf
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Plugins selected: Authenticator webroot, Installer None
Starting new HTTPS connection (1): acme-staging-v02.api.letsencrypt.org
Failed to renew certificate サイト名 with error: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:765)

エラーの種類が変わって、進捗感はあるけど。。。失敗は失敗です。

以下のページを参考にして、CA証明書をインストールしてあげることで解決しました。

SSLError: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed
# openssl version OpenSSL 1.0.2k-fips 26 Jan 2017

CA証明書をインストール

# yum install ca-certificates openssl

改めてcertbot renewをしてみる

やっと更新が成功!

# certbot renew --force-renewal --preferred-chain "ISRG Root X1"

・・・省略・・・

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Congratulations, all renewals succeeded:
  /etc/letsencrypt/live/サイト名/fullchain.pem (success)
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

仕上げにapacheを再起動。

# systemctl restart httpd


一安心。。

補足

今回、コマンドに直接「–preferred-chain」オプションを付加しましたが、confファイルにあらかじめオプションを追加できます。
こうすることで、コマンド実行時にオプションを省略することが可能です。

「preferred_chain」オプションをconfファイルに追加

「/etc/letsencrypt/renewal/」配下に「サイト名.conf」があると思います。
この「サイト名.conf」を編集します。

# vi /etc/letsencrypt/renewal/サイト名.conf

・・・省略・・・

[renewalparams]
authenticator = webroot
account = xxxxxxxxxxxxxxxxx
webroot_path = /var/www/html/サイト名,
server = https://acme-v02.api.letsencrypt.org/directory
preferred_chain = ISRG Root X1 ←これを追加

・・・省略・・・

保存した後のコマンドは以下となります。

# dryrun
# certbot renew --dry-run --force-renewal
# 実行
# certbot renew --force-renewal

「–preferred-chain」のオプションを省略して実行できます!

今回は以上となります。

タイトルとURLをコピーしました