Let’s Encrypt証明書をcronで自動更新させていたのだが、
毎回エラーとなっていた。
- OSはCentOS 7.4
- httpdはApache 2.4.6
- SELinuxは有効
- certbot renew を手動で実行すると正常に更新できる
エラーとなったレポートは以下の通り。
Cert is due for renewal, auto-renewing... Plugins selected: Authenticator apache, Installer apache Starting new HTTPS connection (1): <a href="http://acme-v01.api.letsencrypt.org/" target="_blank" rel="noopener noreferrer" data-saferedirecturl="https://www.google.com/url?hl=ja&q=http://acme-v01.api.letsencrypt.org&source=gmail&ust=1513823431740000&usg=AFQjCNEDWurBM4xjfsNLFNBKD6oVruufgQ">acme-v01.api.letsencrypt.org</a> Renewing an existing certificate Performing the following challenges: tls-sni-01 challenge for <a href="http://jmd.jp/" target="_blank" rel="noopener noreferrer" data-saferedirecturl="https://www.google.com/url?hl=ja&q=http://jmd.jp&source=gmail&ust=1513823431741000&usg=AFQjCNHaFxnQOOXWkzHONP8i1lGxnHRTIQ">jmd.jp</a> tls-sni-01 challenge for <a href="http://www.jmd.jp/" target="_blank" rel="noopener noreferrer" data-saferedirecturl="https://www.google.com/url?hl=ja&q=http://www.jmd.jp&source=gmail&ust=1513823431741000&usg=AFQjCNEVQXmw0ubxHzYFTNE_ZyMYRoCOYA">www.jmd.jp</a> Error while running apachectl graceful. 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 Attempting to renew cert (<a href="http://jmd.jp/" target="_blank" rel="noopener noreferrer" data-saferedirecturl="https://www.google.com/url?hl=ja&q=http://jmd.jp&source=gmail&ust=1513823431741000&usg=AFQjCNHaFxnQOOXWkzHONP8i1lGxnHRTIQ">jmd.jp</a>) from /etc/letsencrypt/renewal/jmd.<wbr />jp.conf produced an unexpected error: Error while running apachectl graceful. Job for httpd.service failed because the control process exited with error code. See "systemctl status httpd.service" and "journalctl -xe" for details. . Skipping.
結論としてはcertbot renewをcronから実行する際にSELinuxが有効となっていることが原因らしい。
ブール値かなにかを調整しての対応が正しいと思うのだが、とりあえずcronで実行させるシェルスクリプトを以下のようにしてcertbot実行の前後でSELinuxを無効→有効としたら正常に自動更新できるようになった。
#!/bin/bash setenforce 0 certbot renew setenforce 1