Help us understand the problem. What is going on with this article?

let's Encryptの証明書更新 CentOS7編

More than 1 year has passed since last update.

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.

  1. ※ systemd timerでは、指定した時刻からランダムに遅らせて起動、というのを指定することができます。これがないと、だいたいみんなn時0分を指定するから、let'sEncrypt側のサーバは毎時0分の負荷急増に備えないといけないわけですが、この仕組みでみんながランダムな時刻に処理するようになれば、負荷が平滑化されて、エコな運用ができるようになりますよね。 

admin-guild
「Webサービスの運営に必要なあらゆる知見」を共有できる場として作られた、運営者のためのコミュニティです。
https://admin-guild.slack.com
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした