ページ目次
無料のSSL証明書を発行してくれる
本当にありがたいです。大規模サイトならいざ知らず、弱小サイトにとっては、年間うん万円の支出がなくなるのは本当に大きいです。
過去記事: SSLが無料で使えるLet’s EncryptをNginxに投入した
証明書の有効期間は3ヶ月
通常の証明書発行機関で申請すると、基本的に有効期限は1年単位なのですが、こちらの場合は3ヶ月(90日)になります。
しかしながら、簡単に更新手続きできる(ターミナルからコマンド叩くだけ)ので、手間にはなりません。と、思っていたら。。。
証明書の期限切れでサイトにアクセスできない事態発生
ちゃんとcrontabで自動化してたのに
何気なくSearch Consoleをチェックしていると、
「SSL / TLS 証明書が有効期限切れになっていることが判明しました。」
とか、言ってる。
多くの例にならい、下記のようにcrontabで更新処理を自動化していたのですが。
$ vi ssl_renewal.sh
#!/bin/sh
certbot renew --quiet --post-hook "service nginx restart"
# --quiet ログを表示させない
# --post-hook 更新処理後にNginxを再起動して新しい証明書を適用する
// crontabに登録
$ crontab -e
# 毎週月曜AM4時に実行
0 4 * * 1 ~/ssl_renewal.sh
原因: certbotではなくcertbot-autoだった
なんとも恥ずかしい初歩的ミス。証明書を発行する時はcertbot-autoでやっていたのに、なぜ気付かなかったのか。
ちなみに、CentOS7になるとYumでcertbotパッケージがインストールできるようになっています(標準のPythonのバージョンが上がっているからだと思われ)。
その際は、certbot -[オプション]で使用します。
今回の環境はCentOS6でした。ユーザーガイドに従い、wgetで入手しました。その際、呼び出すにはファイルを直接参照する必要があります。
(e.g. ./certbot/certbot-auto -[オプション])
よって、手順通りインストールを施したなら、CentOS6系の場合は、「certbot-auto」となり、CentOS7系には、「certbot」となる。
$ vi ssl_renewal.sh
# certbotをcertbot-autoに書き換え
certbot-auto renew --quiet --post-hook "service nginx restart"
とりあえず手動で更新してみたらエラーがでた
手動でcertbot-auto renewしたらエラー
自動更新用のファイルも書き換えたので、とりあえず今回のところは手動で更新しておこうとrenewコマンドを叩きました。しかしエラーが出ました。
Attempting to renew cert from /etc/letsencrypt/renewal/YOURDOMAIN.conf/ produced an unexpecting error: Failed authorization procedure. YOURDOMAIN (http-01): urn:acme:error:connection :: The server could not connect to the client to verify the domain :: Could not connect to YOURDOMAIN.
そのドメインにアクセスできねえよ。と、言われた。
原因: すでに証明書の期限が切れてたから?
正直理由が分かりません。証明書の期限が切れる前にやらないといけないのか?この辺要調査です。
–force-renewalで更新処理を実行
証明書の期限が切れていることは間違いないので、強制的に更新処理を行います。
$ certbot-auto certonly --force-renewal --webroot -w [サイトのrootパス] -d [ドメイン名]
これで証明書が新しくなりました!
サーバーの再起動は忘れずに。
問題はまた90日後にやってくる。のか、、、!?
追記:root権限がいるのね!
今回証明書が更新できてなかったのは、cron実行用のbashファイルにcertbot-autoと書かないといけないところを、certbotと書いていたというなかなかの凡ミスが原因であったことは間違いありません。
しかしながら、例えcertbot-autoと書いていても証明書の更新できていなかったと思われます。
いえ、行われなかったです。
理由は、証明書作成、もしくは更新時に、Certbotがroot権限を要求するからです(そういやパスワード入力したな…)。
そのため、通常のユーザーでcrontabを登録していると、更新作業は行われません。
もう凡ミスはしたくない!root権限でcrontabを登録!
rootでcertbotを動かすため、root権限でcrontabを登録します。
$ sudo crontab -e
#!/bin/sh
# rootのためフルパスで要記述
0 4 * * 1 /【フルパス】/renewal_ssl.sh
これでバッチリ!
の、はず。。。