2017年、WEBサービス界においてlet's Encryptを使ってサービスをHTTPS化するのは普通のこととして定着してきた感があります。
やり方をググると、certbotで証明書を入手したあと、crontabで更新するスクリプトを書きましょう、みたいなことが書かれたページがたくさん見つかります。
ですが、CentOS 7をはじめとして、パッケージでcertbotをインストールするようなディストリビューションでは、certbotと一緒に、証明書を更新するための設定ファイルが一緒に配布されています。
中途半端な設定を書いて試行錯誤しなくても、バッチリおすすめの設定で証明書を更新する仕組みが用意されているので、断然こっちを使いましょう。
自動更新を設定する
CentOS 7の場合を例に上げて説明します。
let's Encrypt公式の説明にある通り、 CentOS7では、sudo yum install certbot
で certbotコマンドがインストールされます。このパッケージの中身を確認すると、
$ sudo rpm -ql certbot
/etc/letsencrypt
/etc/sysconfig/certbot
/usr/bin/certbot
/usr/bin/letsencrypt
/usr/lib/systemd/system/certbot-renew.service
/usr/lib/systemd/system/certbot-renew.timer
:
systemdの起動ファイルと、timerファイルが。
.timerは、crontabじゃなくてsystemctlの機構を使ってサービスを定期実行するための設定ファイルです。
( 参考: systemdでtimerの作り方(最小限のサンプル) )
この設定ファイルを有効にしてあげれば、それだけで証明書が自動更新されるようになります。
$ sudo systemctl enable --now certbot-renew.timer
Created symlink from /etc/systemd/system/timers.target.wants/certbot-renew.timer to /usr/lib/systemd/system/certbot-renew.timer.
設定されたことを確認します
$ sudo systemctl list-timers
NEXT LEFT LAST PASSED UNIT ACTIVATES
Mon 2018-01-01 22:27:02 JST 1h 55min left Sun 2017-12-31 22:27:02 JST 22h ago systemd-tmpfiles-clean.timer systemd-tmpfiles-clean.service
Tue 2018-01-02 05:20:47 JST 8h left Mon 2018-01-01 20:23:32 JST 8min ago certbot-renew.timer certbot-renew.service
2 timers listed.
certbot-renew のNEXT欄に起動予定時刻が入っていればOKです。
これで、毎日0時から6時までの間に一回1 、証明書の更新チェックが走るようになります。
更新後にnginxの再起動
証明書更新後に何かしたい、といった要望を実現する仕組みもあらかじめ用意されています。
$ sudo editor /etc/sysconfig/certbot
:
# Command to be run in a shell after attempting to
# obtain/renew certificates. Can be used to deploy
# renewed certificates, or to restart any servers that
# were stopped by --pre-hook. This is only run if an
# attempt was made to obtain/renew a certificate. If
# multiple renewed certificates have identical post-
# hooks, only one will be run.
#
# An example to restart httpd would be:
# POST_HOOK="--post-hook 'systemctl restart httpd'"
私訳
POST_HOOKは、証明書の取得/更新後にシェルで実行するコマンドを書きます。
証明書更新後に証明書をデプロイしたり、更新前に--pre-hookで止めたサーバを再起動させたりするのに使います。
これは、複数の証明書が更新されたとしても一回だけ実行されます。
例えばhttpdを再起動したい場合は
POST_HOOK="--post-hook 'systemctl restart httpd'"
という具合です
ということで、証明書更新後にnginxのリロードを実施したい場合は、
POST_HOOK="--post-hook 'systemctl reload nginx'"
で行うことができます。
ログ
普通のサービスと同様にsystemctl statusで見ることができます。
$ sudo systemctl status certbot-renew
* certbot-renew.service - This service automatically renews any certbot certificates found
Loaded: loaded (/usr/lib/systemd/system/certbot-renew.service; static; vendor preset: disabled)
Active: inactive (dead) since Tue 2018-01-02 04:11:36 JST; 5h 23min ago
Process: 15714 ExecStart=/usr/bin/certbot renew $PRE_HOOK $POST_HOOK $RENEW_HOOK $CERTBOT_ARGS (code=exited, status=0/SUCCESS)
Main PID: 15714 (code=exited, status=0/SUCCESS)
Jan 02 04:11:36 linode7 certbot[15714]: -------------------------------------------------------------------------------
Jan 02 04:11:36 linode7 certbot[15714]: new certificate deployed without reload, fullchain is
Jan 02 04:11:36 linode7 certbot[15714]: /etc/letsencrypt/live/hoge.mogya.com/fullchain.pem
Jan 02 04:11:36 linode7 certbot[15714]: -------------------------------------------------------------------------------
Jan 02 04:11:36 linode7 certbot[15714]: -------------------------------------------------------------------------------
Jan 02 04:11:36 linode7 certbot[15714]: Congratulations, all renewals succeeded. The following certs have been renewed:
Jan 02 04:11:36 linode7 certbot[15714]: /etc/letsencrypt/live/hoge.mogya.com/fullchain.pem (success)
Jan 02 04:11:36 linode7 certbot[15714]: -------------------------------------------------------------------------------
Jan 02 04:11:36 linode7 systemd[1]: Started This service automatically renews any certbot certificates found.
-
※ systemd timerでは、指定した時刻からランダムに遅らせて起動、というのを指定することができます。これがないと、だいたいみんなn時0分を指定するから、let'sEncrypt側のサーバは毎時0分の負荷急増に備えないといけないわけですが、この仕組みでみんながランダムな時刻に処理するようになれば、負荷が平滑化されて、エコな運用ができるようになりますよね。 ↩