無料のSSL証明書「Let’s Encrypt」の更新でエラーが出た

プログラミング

Let’Encryptとはだれでも無料で使えるSSL証明書(正確には「SSL/TLSサーバー証明書」らしいです)を発行してくれるありがたいサービスです。

有料での証明書を購入してサーバーにインストールしてもいいのですが、無料のものがあるならそちらを使いたくなりますね。

ということで、お客さんに納品しているアプリは、無料のSSL証明書発行サービスであるLet’s Encryptを使って常時SSL化しました。

ただ無料の証明書もいいことばかりではなく、有効期限が3カ月と短いのです。有効期限が切れてしまうと、サイトが表示できなくなってしまうので恐ろしいですね。

でもご安心ください。有効期限が来るまでに更新してやればいいだけのことです。自動で更新する方法もあります。

で、前置きが長くなりましたが、そのSSL証明書の更新がエラーになって冷や汗をかいたので、その対処法を紹介します

前提

  • CentOS7
  • Nginx
  • Unicorn
  • Rails

Nginx + Unicorn でRails のアプリケーションを動くアプリケーションです。
SSL証明書の有効期限がせまってきたので、更新のコマンドを打ってみました。

更新コマンド実行するとエラーに

# sudo certbot renew --dry-run


Saving debug log to /var/log/letsencrypt/letsencrypt.log

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Processing /etc/letsencrypt/renewal/bbb.ccc.conf
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Cert not due for renewal, but simulating renewal for dry run
Plugins selected: Authenticator apache, Installer apache
Starting new HTTPS connection (1): acme-staging-v02.api.letsencrypt.org
Renewing an existing certificate
Performing the following challenges:
http-01 challenge for bbb.ccc
Error while running apachectl graceful.

Job for httpd.service invalid.

Unable to restart apache using ['apachectl', 'graceful']
Error while running apachectl restart.

Job for httpd.service failed because the control process exited with error code. See "systemctl status httpd.service" and "journalctl -xe" for details.

Cleaning up challenges
Error while running apachectl graceful.

Job for httpd.service invalid.

Unable to restart apache using ['apachectl', 'graceful']
Error while running apachectl restart.

Job for httpd.service failed because the control process exited with error code. See "systemctl status httpd.service" and "journalctl -xe" for details.

Encountered exception during recovery:
Traceback (most recent call last):
  File "/usr/lib/python2.7/site-packages/certbot/_internal/error_handler.py", line 125, in _call_registered
    self.funcs[-1]()
  File "/usr/lib/python2.7/site-packages/certbot/_internal/auth_handler.py", line 243, in _cleanup_challenges
    self.auth.cleanup(achalls)
  File "/usr/lib/python2.7/site-packages/certbot_apache/_internal/configurator.py", line 2330, in cleanup
    self.restart()
  File "/usr/lib/python2.7/site-packages/certbot_apache/_internal/configurator.py", line 2200, in restart
    self._reload()
  File "/usr/lib/python2.7/site-packages/certbot_apache/_internal/configurator.py", line 2227, in _reload
    raise errors.MisconfigurationError(error)
MisconfigurationError: Error while running apachectl restart.

Job for httpd.service failed because the control process exited with error code. See "systemctl status httpd.service" and "journalctl -xe" for details.

Attempting to renew cert (bbb.ccc) from /etc/letsencrypt/renewal/bbb.ccc.conf produced an unexpected error: Error while running apachectl restart.

Job for httpd.service failed because the control process exited with error code. See "systemctl status httpd.service" and "journalctl -xe" for details.
. Skipping.

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Processing /etc/letsencrypt/renewal/aaa.bbb.ccc.conf
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Cert not due for renewal, but simulating renewal for dry run
Plugins selected: Authenticator apache, Installer apache
Starting new HTTPS connection (1): acme-staging-v02.api.letsencrypt.org
Renewing an existing certificate
Performing the following challenges:
http-01 challenge for aaa.bbb.ccc
Error while running apachectl graceful.

Job for httpd.service invalid.

Unable to restart apache using ['apachectl', 'graceful']
Error while running apachectl restart.

Job for httpd.service failed because the control process exited with error code. See "systemctl status httpd.service" and "journalctl -xe" for details.

Cleaning up challenges
Error while running apachectl graceful.

Job for httpd.service invalid.

Unable to restart apache using ['apachectl', 'graceful']
Error while running apachectl restart.

Job for httpd.service failed because the control process exited with error code. See "systemctl status httpd.service" and "journalctl -xe" for details.

Encountered exception during recovery:
Traceback (most recent call last):
  File "/usr/lib/python2.7/site-packages/certbot/_internal/error_handler.py", line 125, in _call_registered
    self.funcs[-1]()
  File "/usr/lib/python2.7/site-packages/certbot/_internal/auth_handler.py", line 243, in _cleanup_challenges
    self.auth.cleanup(achalls)
  File "/usr/lib/python2.7/site-packages/certbot_apache/_internal/configurator.py", line 2330, in cleanup
    self.restart()
  File "/usr/lib/python2.7/site-packages/certbot_apache/_internal/configurator.py", line 2200, in restart
    self._reload()
  File "/usr/lib/python2.7/site-packages/certbot_apache/_internal/configurator.py", line 2227, in _reload
    raise errors.MisconfigurationError(error)
MisconfigurationError: Error while running apachectl restart.

Job for httpd.service failed because the control process exited with error code. See "systemctl status httpd.service" and "journalctl -xe" for details.

Attempting to renew cert (aaa.bbb.ccc) from /etc/letsencrypt/renewal/aaa.bbb.ccc.conf produced an unexpected error: Error while running apachectl restart.

Job for httpd.service failed because the control process exited with error code. See "systemctl status httpd.service" and "journalctl -xe" for details.
. Skipping.
All renewal attempts failed. The following certs could not be renewed:
  /etc/letsencrypt/live/bbb.ccc/fullchain.pem (failure)
  /etc/letsencrypt/live/aaa.bbb.ccc/fullchain.pem (failure)

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
** 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/bbb.ccc/fullchain.pem (failure)
  /etc/letsencrypt/live/aaa.bbb.ccc/fullchain.pem (failure)
** DRY RUN: simulating 'certbot renew' close to cert expiry
**          (The test certificates above have not been saved.)
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
2 renew failure(s), 0 parse failure(s)

エラーの内容

なんだかApacheの再起動でエラーになっているようです。

「systemctl status httpd.service」を見ろと言われたので、コマンドで確認するとなんだかエラーが・・
でもさっぱりわかりません。

ここで必死になってGoogle先生に聞きまくったのですが、解決できませんでした。

対処法

Apacheの再起動でなっているので、手動でApacheを再起動してみました。
⇒ 結果はエラー

ここでようやく思い出しました。
このアプリではApacheではなく、Nginxを使っていることを。

Nginxを停止後、更新コマンドを実行すると無事正常終了。
更新期限も90日になってくれていました。

手順としては、
 1. Nginxの停止
 2.有効期限の更新
 3.Apacheの停止
 4.Nginxの起動
となります。

まとめ

ド素人が管理しているので、こんなカンタンなことでもハマってしまって恐ろしい思いをしました。
Nginx + Unicorn で Rails のアプリを動かしておられる初心者の方はお気をつけください。

コメント