IT実践

Let’s EncryptでSSL証明書の発行・更新・トラブル

Let’s Encryptから「証明書の期間があと20日で切れますよ」という英文メールが届きました。

cronで定期的にrenewをかけて自動更新しているのですが、何か設定がおかしいのかなと思い、複数のssl証明書を管理しているサーバにログインをしてみました。

原因が良くわからなかったので、該当ドメインを登録し直すために現在の更新情報ファイルを削除しました。

rm /usr/local/etc/letsencrypt/renewal/DOMAIN.conf

上記が正しいコマンドですが、深夜のせいか使い慣れないマウスのせいか、

rm /usr/local/etc/letsencrypt/renewal

ん?ディレクトリだから消せないよと英文メッセージ。
confなのにディレクトリなのか。と深く考えもせずRオプション追加。

rm -R /usr/local/etc/letsencrypt/renewal

( ̄▽ ̄||| … Enter押して1秒後に気付きました。
renewalディレクトリごと消してしまった…。
全てのドメインのssl更新ファイルが消失しました。
Unix系のOSにはWindowsのようなゴミ箱はありません。
復旧ツールもあるみたいですが、稼働中サーバにいきなり入れてみるのも気が引けたので、潔くあきらめて手動で復旧させる事にしました。

私の環境では/usr/local/etc/letsencryptですが、/etc/letsencryptの場合も多いようですので、読み替えてください。
またcertbotコマンドはcertbot-autoになっているようですので、そのあたりも読み替えてください。

Let’s Encryptの登録をやり直す

ドメインごとの情報ファイルを削除

以下を消します。

  • /usr/local/etc/letsencrypt/live/DOMAIN_DIR
  • /usr/local/etc/letsencrypt/renewal/DOMAIN.conf
  • /usr/local/etc/letsencrypt/archive/DOMAIN_DIR

ここでも注意。
※真似るな危険! ↓↓↓

rm -r /usr/local/etc/letsencrypt/archive DOMAIN_DIR

として、今度はarchiveディレクトリまで消してしまいました。
(スラッシュとスペースの間違え)
もうrenewalを全て消してしまっていたので別に良かったんですけどね…。
rmミスって他人事のように聞いてきましたが、今まで15年以上一度も間違えたことが無かったのですが2連発でやらかしました。

得たものとしては、稼働中の全てのドメインを作り直したい場合にはディレクトリを丸ごと消してしまえば、後で自動で作成されるという事でしょうか。

Webサーバの設定ファイルを一時的に変更する

80番ポートでのアクセスを許可しておく必要があります。
wwwあり・なし両方を登録する場合には、どちらからでもアクセスできるようにしておきます。
sslの設定がWebサーバ(ApacheやNginx等)のconfファイルに書かれている場合、letsencryptのliveディレクトリ等を消しているため正常に起動しないので、ssl関連は全てコメントアウトにしておく必要があります。

私はコメントアウトではなく、DOMAIN.confを複製して退避して、80番ポート専用のconfを作りました。この方が余計な行を気兼ねなく消せるのでお勧めです。

cp DOMAIN.conf DOMAIN.conf_org

Webサーバを再起動(または設定ファイルの再読み込み)させる

Nginxであれば nginx -s reload
Apacheであれば apachectl restart

ブラウザから確認する

Nginxのバーチャルホスト環境で、設定ファイル読み込みの際にはエラーが表示されていないにも関わらず、正常に起動できていない事がありました。複数のドメインを設定している場合には、設定変更したドメインとは別のドメインが正しくブラウザで表示されるかを確認しておいた方が良いです。
その後、該当ドメインの80番ポート(http)の確認をするべきですが、キャッシュの問題等で面倒だったので、私は省略しました。

Let’s Encryptへコマンドを送る

certbot certonly --webroot -w /home/DIR/public_html -d DOMAIN -d www.DOMAIN

上述のLet’s Encrypt設定ファイルが残っていると、[E]xpand / [C]ancelと聞かれる場合があります。
ここでCancelを選んでしまうと、DOMAIN-0001という別の設定情報が作成されてしまいますのでEを押します。

正しく反映されると、以下のようなメッセージが表示されます。

IMPORTANT NOTES:
 - Congratulations! Your certificate and chain have been saved at:
 ~
 ~

念のため確認します。
以下のコマンドで一覧に表示されていれば正常です。

certbot certificates

Webサーバの設定を元に戻します

上記の例で、DOMAIN.conf_orgに複製している場合は以下のようになります。

mv DOMAIN.conf DOMAIN.conf_80
mv DOMAIN.conf_org DOMAIN.conf

また必要になるかもしれないので80番ポート専用の設定ファイルとして残しました。


 

DOMAIN-0001を消すには

certbot delete --cert-name DOMAIN-0001

で消せます。
Webサーバのssl設定でこのDOMAIN-0001を過去に指定していないか注意してください。


 

Let’s Encryptの制限について

あれこれ失敗してやり直しをしていると「7日間で5回まで」という制限に引っかかってしまいます。
しかし待っていられない状況の場合が多いと思います。
この場合、コマンドに含めるFQDNを変えれば大丈夫なので、以下の例はサブドメインを追加しています。(Webサーバでサブドメイン設定をしておく必要があります)

certbot certonly --webroot -w /home/DIR/public_html -d DOMAIN

certbot certonly --webroot -w /home/DIR/public_html -d DOMAIN -d test.DOMAIN

私の場合は、wwwあり・なし両方で有効な証明書を取得するために、もともと以下のようにしていました。

certbot certonly --webroot -w /home/DIR/public_html -d DOMAIN -d www.DOMAIN

ですので、それぞれに分けて登録することにしました。(Webサーバのssl設定箇所の変更が必要になります)

certbot certonly --webroot -w /home/DIR/public_html -d DOMAIN
certbot certonly --webroot -w /home/DIR/public_html -d www.DOMAIN

ただし回数制限は、サービス提供元の過負荷対策であったりするので、どうしても必要な時に限って行うようにしましょう。