[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証明書をインストールしてあげることで解決しました。
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」のオプションを省略して実行できます!
今回は以上となります。