LetsEncryptのcertbot自動更新エラー
突然やってきたLet’s Encryptからのメール。
Let’s Encrypt certificate expiration notice for domain “pc-taskal.net"
">Hello,
Your certificate (or certificates) for the names listed below will expire in
19 days (on 17 Sep 17 07:36 +0000). Please make sure to renew
your certificate before then, or visitors to your website will encounter errors.
pc-taskal.net
For any questions or support, please visit https://community.letsencrypt.org/.
Unfortunately, we can't provide support by email.
あと19日で証明書の期限が切れますよと。
cronに仕込んで自動更新にしてあるので大丈夫だろうと思っていたのですが、そろそろ更新されただろうとログを見てみると・・・
どうやらサイトのSSL証明書のcertbotによる自動更新がエラーで出来ない状態になっていました。
エラーの内容
certbotのログは /var/log/letsencrypt/letsencrypt.log にあります。
問題となっている箇所を一部摘出してみると・・・
2017-08-29 05:56:26,689:DEBUG:certbot.plugins.disco:Other error:(PluginEntryPoint#apache): There has been an error in parsing the file /etc/apache2/sites-enabled/default-ssl.conf on line 147: Syntax error
Traceback (most recent call last):
PluginError: There has been an error in parsing the file /etc/apache2/sites-enabled/default-ssl.conf on line 147: Syntax error
2017-08-29 05:56:26,689:DEBUG:certbot.plugins.selection:No candidate plugin
2017-08-29 05:56:26,690:DEBUG:certbot.plugins.selection:No candidate plugin
2017-08-29 05:56:26,690:DEBUG:certbot.plugins.selection:Selected authenticator None and installer None
2017-08-29 05:56:26,690:INFO:certbot.main:Could not choose appropriate plugin: The apache plugin is not working; there may be problems with your existing configuration.
The error was: PluginError('There has been an error in parsing the file /etc/apache2/sites-enabled/default-ssl.conf on line 147: Syntax error',)
2017-08-29 05:56:26,691:WARNING:certbot.renewal:Attempting to renew cert from /etc/letsencrypt/renewal/pc-taskal.net.conf produced an unexpected error: The apache plugin is not working; there may be problems with your existing configuration.
The error was: PluginError('There has been an error in parsing the file /etc/apache2/sites-enabled/default-ssl.conf on line 147: Syntax error',). Skipping.
The error was: PluginError('There has been an error in parsing the file /etc/apache2/sites-enabled/default-ssl.conf on line 147: Syntax error',)
どうもdefault-ssl.conf あたりに問題がありそうです。
そしてプラグインが問題の元凶なのかなと想像できますね。
スポンサーリンク
apache2の設定ファイルに問題がないか確認
apache2の設定ファイルの確認する以前に、ちゃんと起動しているので設定ファイルに問題は無いはずです。
念の為確認します。
# apache2ctl configtest
Syntax OK
どうやら問題ないようです。
手動で更新確認してみる
certbotコマンドを手動で実行し確認してみます。
# certbot renew --dry-run
やはりプラグインエラーとSyntax errorになります。
こうなると設定ファイルを確認するしかありません。
問題のファイルを確認
ログから問題のファイルは default-ssl.conf だということがわかります。
ですのでこのファイルか、その関連ファイルの問題と思われます。
そして、プラグインエラーとなっているので、このファイルで使っているプラグインはSSLしかありませんので、そのあたりが怪しいです。
Syntax errorと出ているので、どこか構文が間違っているのでしょうか。
はじめのちは全然気付かなかったのですが、発見しました。
このファイルは初期状態だと
<IfModule mod_ssl.c>
<VirtualHost _default_:443>
で始まっていると思います。
そうなると終わりは
</VirtualHost>
</IfModule>
となるはずなのですが、何かの拍子に消してしまったのでしょうか、</IfModule> の閉じタグがありません。
モジュールのタグが閉じていないのでエラーになっていたようです。
スポンサーリンク
修正して再度実行
修正して再度ドライランしてみると問題なく完走。
更新を実行します。
# certbot renew
成功です。
証明書もちゃんと更新されました。
自動更新の注意点
Let’s Encrypt は3ヶ月ごとに更新しないといけないので面倒ですが、自動で更新してくれるのでcronに仕込んでおけば安心だと思っていると大間違いでした。
期限があるうちの動作と、期限が近づいてきた時の動作は違うので、実際の更新作業が入る時期になると挙動が変わります。
期限のあるうちはエラーが無かったので安心という訳にはいかず、実際に更新が自動で行われるか確認が必要です。
特に初回の更新は注意が必要ですね。
あと、certbot自体もPythonで書かれているので、pythonのアップデートなどがあった場合も注意しておいたほうが良さそうです。
自動だから安心ではなく、期限が切れる前にちゃんと自分で確認しておいたほうが良さそうですね。