みらいテックラボ

音声・画像認識や機械学習など, 週末プログラマである管理人が興味のある技術の紹介や実際にトライしてみた様子などメモしていく.

無料SSL証明書!! Let’s Encryptで更新エラー

「Kingyo AI Navi」[1]のデモにサーバを使用しているのだが, そのSSL証明書発行にLet's Encryptの無料サービスを利用している.
無料サービスなので, 3カ月(90日)に一度SS証明書の更新を行う必要がある.
今回で二度目の更新だったのだが, 少しハマってしまったので, メモを残しておく.


1. SSL証明書更新
本来, 更新自体は簡単な作業であるが, 今回は更新しようとして以下のエラーが発生した.

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

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Processing /etc/letsencrypt/renewal/XXXX.conf
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Cert is due for renewal, auto-renewing...
Plugins selected: Authenticator standalone, Installer None
Renewing an existing certificate
Performing the following challenges:
http-01 challenge for XXXX
http-01 challenge for www.XXXX
Cleaning up challenges
Attempting to renew cert (XXXX) from /etc/letsencrypt/renewal/XXXX.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/XXXX/fullchain.pem (failure)

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

All renewal attempts failed. The following certs could not be renewed:
  /etc/letsencrypt/live/XXXX/fullchain.pem (failure)
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
1 renew failure(s), 0 parse failure(s)

※XXXXはドメイン

Let's Encryptは認証のために80ポートと443ポートを使用するらしく, 今回は80ポートで問題が発生したようだ.
多分サービスか何かが80ポートを使用していて, certbotが80ポートをバインドできなかったのだ.

とりあえず, 稼働しているサービスをチェックしてみる.

$ service --status-all | grep +
 [ + ]  apparmor
 [ + ]  apport
 [ + ]  atd
 [ + ]  binfmt-support
 [ + ]  chrony
 [ + ]  cron
 [ + ]  dbus
 [ + ]  ebtables
 [ + ]  grub-common
 [ + ]  iscsid
 [ + ]  kmod
 [ + ]  lvm2-lvmetad
 [ + ]  lvm2-lvmpolld
 [ + ]  lxcfs
 [ + ]  nginx
 [ + ]  procps
 (省略)

どうもnginxがじゃましてそうなので, nginxを止めて再度更新してみる.
(このサーバでhttpdやnginxを稼働させた記憶はないのだが...)

$ sudo service nginx stop 
$ sudo certbot renew
 (省略)
Congratulations, all renewals succeeded. The following certs have been renewed:
  /etc/letsencrypt/live/XXXX/fullchain.pem (success)
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
$ sudo service nginx restart

更新されたSSL証明書を確認してみる.

$ openssl x509 -in /etc/letsencrypt/live/XXXX/cert.pem  -noout -dates
notBefore=Sep  1 07:47:36 2019 GMT
notAfter=Nov 30 07:47:36 2019 GMT

正常にSSL証明書が更新されたようだ.


2. 自動更新の設定[2]
前回初めてSSL証明書を更新したときはすんなりと更新できて, そんなに気にならなかったのだが, 今回は3カ月経つのが意外と早いと感じたのと, トラブってまた同じようなことを調べるのは面倒なので, 自動更新を設定してみることにした.

一応, nginxが動作しているという前提で, crontabを設定.

$ sudo crontab -u root -e
no crontab for root - using an empty one
crontab: installing new crontab

エディタで, 条件およびコマンドを設定.
毎月1日の12時にSSL証明書を更新するようにしてみた.

0 12 1 * * /usr/bin/certbot renew --dry-run --pre-hook "service nginx stop" --post-hook "service nginx restart"

しばらくは, ちゃんとSSL証明書が更新されるか気にとめておこう!!

---
参照URL:
[1] 「Kingyo AI Navi」のアプリ化を考える (1) ~ (5)
[2] Let’s Encryptの証明書更新に失敗した時の対処法とcronの自動更新設定





本気で学ぶ Linux実践入門 サーバ運用のための業務レベル管理術

本気で学ぶ Linux実践入門 サーバ運用のための業務レベル管理術