エラー対応

Let’s Encryptの更新と失敗したときの対処方法

更新日:2019/08/16

Let’ EncrytpのSSL証明書は3か月ごとに、自分で更新しないといけません。

しかし、私はすっかり忘れていたのですが、次のようなメールをお知らせメールをもらいました。

タイトル:Let's Encrypt certificate expiration notice for domain "affi-sapo-sv.com"

Hello,

Your certificate (or certificates) for the names listed below will expire in 9 days (on 26 Aug 19 04:30 +0000). 
Please make sure to renew your certificate before then, or visitors to your website will encounter errors.

あと9日でSSL証明書が失効するそうです。
それまでに証明書を更新しないと、ウェブサイトの訪問者にエラーが発生するんだそうです。

実は、もっと前に一回もらっていたのですが、差出人が「Let's Encrypt Expiry Bot」と、なっていたので無視をしてしまいました。
Botって書かれると、適当なことをつぶやいてるイメージあるので…

ということで、慌ててLet's Encrytpの更新をやってみます。

 

SSL証明書の有効期限の確認

まずは本当に証明書の期限切れが近いのか、確認してみます。

次のコマンドで確認できます。

$ certbot certificates

$ sudo certbot certificates
Saving debug log to /var/log/letsencrypt/letsencrypt.log

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Found the following certs:
  Certificate Name: affi-sapo-sv.com
    Domains: affi-sapo-sv.com
    Expiry Date: 2019-08-26 04:30:49+00:00 (VALID: 9 days)
    Certificate Path: /etc/letsencrypt/live/affi-sapo-sv.com/fullchain.pem
    Private Key Path: /etc/letsencrypt/live/affi-sapo-sv.com/privkey.pem
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

コマンドで表示された結果では、2019年8月26日までで、あと9日で有効期限が切れると出ました。
メールで送られてきた期日と同じですね。

certbotのコマンドは、certbot-autoの場合もあるそうです。
つまり、次のコマンドですね。

$ certbot-auto certificates

なおブラウザでも有効期限を確認できます。
参考ブラウザでLet’s EncryptなどのSSL証明書の有効期限を確認する方法

 

テスト更新をしてみる → エラーがでた

Let’ Encrytpは、実際に証明書の更新ができるかどうかテストできる機能があるので、それを使用してみます。

次のコマンドでテストができます。

$ certbot renew --dry-run

$ sudo certbot renew --dry-run
Saving debug log to /var/log/letsencrypt/letsencrypt.log

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Processing /etc/letsencrypt/renewal/affi-sapo-sv.com.conf
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Cert is due for renewal, auto-renewing...
Plugins selected: Authenticator standalone, Installer None
Starting new HTTPS connection (1): acme-staging-v02.api.letsencrypt.org
Renewing an existing certificate
Performing the following challenges:
http-01 challenge for affi-sapo-sv.com
Cleaning up challenges
<span class="nocode red">Attempting to renew cert (affi-sapo-sv.com) from /etc/letsencrypt/renewal/affi-sapo-sv.com.conf produced an unexpected error: Problem binding to port 80: Could not bind to IPv4 or IPv6.. Skipping.
All renewal attempts failed. The following certs could not be renewed:
/etc/letsencrypt/live/affi-sapo-sv.com/fullchain.pem (failure)</span>

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
** DRY RUN: simulating 'certbot renew' close to cert expiry
**          (The test certificates below have not been saved.)

All renewal attempts failed. The following certs could not be renewed:
/etc/letsencrypt/live/affi-sapo-sv.com/fullchain.pem (failure)
** DRY RUN: simulating 'certbot renew' close to cert expiry
**          (The test certificates above have not been saved.)
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
1 renew failure(s), 0 parse failure(s)

なんか真っ赤になったんですが…

調べてみると、Let’ Encrytpは更新時にhttp(80)とhttps(443)のポートを使用するらしい。
だから更新するときは、そのポートを使用しているapacheやNginxを停止しないといけないんだとか。

Webの停止が前提とか、
なんでそんなダメダメ仕様なんだ!!

とお上品に批判していたのですが、Let’ Encrytp導入時に「standalone」を指定していたのが原因と判明。
後からでも「webroot」に変更すればいいと分かりました。

「webroot」はドメインルートに一時ファイルを作成します。
そしてapacheやNginxなどのすでに稼働中のwebサーバーを通して、一時ファイルにアクセスできるかどうかを確認、認証するそうです。
環境を変更せずに認証できるので、一般的なWeb環境は「webroot」の方がいいですね。

ちなみに「standalone」は、次の手順で認証する方式です。

(1)クライアントにインストールされているcertbotがwebサーバーとなる
(2)外部からwebサーバー(certbot)にアクセスする

certbotがwebサーバーとして機能するためには、certbotがhttp(80)とhttps(443)のポートを専有する必要があります。
しかしそれらのポートはapacheやNginxがすでに使っているので、横取りできずにエラーとなるのです。

どうやら「standalone」は、Webサーバーが動作していない環境でLet' Encrytpを認証するためのモードのようです。

 

standaloneからwebrootへ変更

ということで、standaloneからwebrootへ変更してみます。

コマンド
certbot certonly --webroot -w ドメインルート -d ドメイン名

ドメインルートは、サイトが格納されているファイルシステム上のパスです。

$ sudo certbot certonly --webroot -w /var/www/html -d affi-sapo-sv.com

Saving debug log to /var/log/letsencrypt/letsencrypt.log
Plugins selected: Authenticator webroot, Installer None
Starting new HTTPS connection (1): acme-v02.api.letsencrypt.org
Cert is due for renewal, auto-renewing...
Renewing an existing certificate
Performing the following challenges:
http-01 challenge for affi-sapo-sv.com
Using the webroot path /var/www/html for all unmatched domains.
Waiting for verification...
Cleaning up challenges

IMPORTANT NOTES:
 - Congratulations! Your certificate and chain have been saved at:
   /etc/letsencrypt/live/affi-sapo-sv.com/fullchain.pem
   Your key file has been saved at:
   /etc/letsencrypt/live/affi-sapo-sv.com/privkey.pem
   Your cert will expire on 2019-11-14. To obtain a new or tweaked
   version of this certificate in the future, simply run certbot
   again. To non-interactively renew *all* of your certificates, run
   "certbot renew"
 - If you like Certbot, please consider supporting our work by:

   Donating to ISRG / Let's Encrypt:   https://letsencrypt.org/donate
   Donating to EFF:                    https://eff.org/donate-le

成功したような気がします…

このコマンドは設定ファイルを書き換えてくれるようです。

設定ファイル:/etc/letsencrypt/renewal/ドメイン.conf

変更前

[renewalparams]
authenticator = standalone
account = ひみつ
server = https://acme-v02.api.letsencrypt.org/directory

変更後

[renewalparams]
authenticator = webroot
account = ひみつ
server = https://acme-v02.api.letsencrypt.org/directory
webroot_path = /var/www/html,
[[webroot_map]]
affi-sapo-sv.com = /var/www/html

authenticatorの設定値がstandaloneからwebrootに変更されています。
その他にも、いろいろと設定してくれているようです。

 

SSL証明書更新してみる

再度更新のテストをしてみて、エラーが出なかったので本番やってみます。

$ sudo certbot renew
Saving debug log to /var/log/letsencrypt/letsencrypt.log

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Processing /etc/letsencrypt/renewal/affi-sapo-sv.com.conf
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Cert not yet due for renewal

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
The following certs are not due for renewal yet:
  /etc/letsencrypt/live/affi-sapo-sv.com/fullchain.pem expires on 2019-11-14 (skipped)
No renewals were attempted.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

The following certs are not due for renewal yet
「次の証明書はまだ更新の期限ではありません」
と表示されました…

証明書の期限を確認してみます。

$ sudo certbot certificates
Saving debug log to /var/log/letsencrypt/letsencrypt.log
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

Found the following certs:
  Certificate Name: affi-sapo-sv.com
    Domains: affi-sapo-sv.com
    Expiry Date: 2019-11-14 06:52:19+00:00 (VALID: 89 days)
    Certificate Path: /etc/letsencrypt/live/affi-sapo-sv.com/fullchain.pem
    Private Key Path: /etc/letsencrypt/live/affi-sapo-sv.com/privkey.pem
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

残り89日になってます。

どうやら、standaloneからwebrootへ変更したときに、更新されていたようです。

 

最後に

ネットでLet’ Encrytpのインストール方法を調べると、ほぼすべてstandaloneが指定されています。

よくわからずに私もコピペして実行していましたが、よく確認してから実行すべきかなと思いました。

更新日:2019/08/16

書いた人(管理人):けーちゃん

スポンサーリンク

記事の内容について

null

こんにちはけーちゃんです。
説明するのって難しいですね。

「なんか言ってることおかしくない?」
たぶん、こんなご意見あると思います。

裏付けを取りながら記事を作成していますが、僕の勘違いだったり、そもそも情報源の内容が間違えていたりで、正確でないことが多いと思います。
そんなときは、ご意見もらえたら嬉しいです。

掲載コードについては事前に動作確認をしていますが、貼り付け後に体裁を整えるなどをした結果動作しないものになっていることがあります。
生暖かい視線でスルーするか、ご指摘ください。

ご意見、ご指摘はこちら。
https://note.affi-sapo-sv.com/info.php

 

このサイトは、リンクフリーです。大歓迎です。