Let’s Encrypt の証明書の更新エラー(CentOS7, Certbot)

 2021年11月7日

Node.js で走らせている《テクミュ》は,Let’s Encrypt で SSL 化しています。

Let’s Encrypt はフリー自動化されたオープンな認証局です。

(有料の SSL の証明書は高いですね。EV SSL とか,安くても 38,280円/年ですね。)

サーバーは Cent OS です。Certbot を yum でインストールして更新させていたのですが,あるときから,更新時にエラーが出るようになってしまいました。

Saving debug log to /var/log/letsencrypt/letsencrypt.log
Plugins selected: Authenticator standalone, Installer None
Starting new HTTPS connection (1): acme-v02.api.letsencrypt.org
An unexpected error occurred:
SSLError: ("bad handshake: Error([('SSL routines', 'ssl3_get_server_certificate', 'certificate verify failed')],)",)
Please see the logfiles in /var/log/letsencrypt for more details.

そのため,Web サイトにアクセスすると,下のようなエラーが出ます。

これは困る。

SSLError: (“bad handshake: Error([(‘SSL routines’, ‘ssl3_get_server_certificate’, ‘certificate verify failed’)],)”,)

ここがネックですが,このエラーでググっても,解決作が見つかりません。

今一度,Let’s Encrypt の公式ページや Certbot に関する情報を見直してみました。

すると解決。エラーの原因はこちらでした。

2021年にLet’s Encryptのルート証明書が変更!影響や備えておくべきこととは?

Let’s Encrypt のルート証明書の仕様が変わっていたためです。

(「DST Root X3」が certbot で更新できなくなっていた,らしい。)

今,ググってみると,同様の問題が発生しているサイトが多くあったようですね。

Let’s EncryptのルートCA証明書期限切れ、多数のサイトで問題発生

snapd をインストールする

ダメな手順

CentOS7 に Certbot をインストールする手順は,ググったらいくつも出ますが,それらでインストールされる Certbot が古いことが原因でした(多分)。

例えば,多くのサイトでの Certbot のインストール手順は次のとおりです。

(1)EPEL のインストール

$ sudo yum install -y epel-release

(2) certbot のインストール

$ sudo yum install -y certbot python-certbot-apache

(3) 証明書の作成

ここから後は Apache で動かすのか Standalone で取得するのかなどで分岐するため,詳細は略。下はコマンド例。

# certbot certonly --webroot -w /var/www/html/ -d example.com

上で取得した証明書を使うとエラーになります。

もしくは,証明書自体取得できません。

良い手順

ダメな手順では EPEL リポジトリから certbot を引っ張ってきましたが,そうではなく,snapd を用います。

こちらを参照。

certbot instructions

(1) snapd をインストール

epel をとおして,yum でインストールできます。下を参照。

Installing snap on CentOS

(2) core を snap コマンドでインストール

$ sudo snap install core; sudo snap refresh core

core が何を指しているのか分かりませんが(ダメですね),公式サイトに沿って,愚直にインストール。

(3) snap で certbot をインストール

$ sudo snap install --classic certbot

(4) シンボリックリンクを作成

$ sudo ln -s /snap/bin/certbot /usr/bin/certbot

これで certbot が叩けます。

ここから後は,環境(Apacheかどうか)によって分岐します。

Apache なら,下のコマンドを打つと証明書を取得して,Virtual Host のファイルを conf.d に作ってくれます。

$ sudo certbot --apache

手動更新時は下のコマンドらしいですね。

$ sudo certbot renew --dry-run

ただ,自動的に,最新の証明書を拾ってくるように設定してくれているようです。

すごい。

サイト表示も元通り

上の手順で,Let’s Encrypt の証明書も無事再取得できました。

CentOS が開発終了したので,次にサーバー立てるときは,CentOS 以外のものを選択すると思います。

CentOS をフォークした OS(「Rocky Linux」とか) か,Ubuntu か。

そのときには,certbot を引っ張ってくるリポジトリも変わっているでしょうから,このような問題は起きないと思います。

Let’s Encrypt 側に仕様変更があっても,無料の証明局なので,文句はいえません。

今後も,ありがたく使わせていただきます。