はじめに
突然サービスのSSL証明書が切れまして
定期的にrenewするようにcronを設定してたのですが、何が起きたのか。。。
とりあえず解決ができたので、共有をば
要点
まずはcertbotの更新
yum install -y --enablerepo=epel certbot
そして認証局の証明書群のインストール
yum install -y ca-certificates
最後にCloudFlareの設定画面にてフレキシブルを選択
↑これは気づけなかった...
問題発生
夜中に、いきなりさ、証明書の有効期限切れてるよってLINE〜♪
怖
certbotをcrontabで動かしていて、今まで動いてたんだけどな。。。
切れたのが夜でよかった。。。
確認してみると、以下のように設定しているcrontabがうまく動作していないということが判明
vi /etc/cron.d/certbot
0 0 18 * * root /bin/certbot renew --force-renew --post-hook "systemctl reload httpd"
というわけで、上記を --dry-run
つけて実行してみると
/bin/certbot renew --force-renew --dry-run
Starting new HTTPS connection (1): acme-staging-v02.api.letsencrypt.org
Failed to renew certificate foo.bar with error: __str__ returned non-string (type Error)
というエラーが発生しているせいで、 fullchain.pem
が更新できていない様子
ログを見てみると
less /var/log/letsencrypt/letsencrypt.log
なんか要するにAPIアクセスが失敗してて、stringに入るべきところに何も入ってない的なことがわかった
こことか見てて、ライブラリの問題があるっぽかったんだけど、なんと残念ながらこちらの環境はpipでライブラリをインストールしているわけじゃない様子だったので、バージョン変更できず。。。
ならば問題の箇所である urllib3
の方でエラー文調べてみると
認証局の証明書群をインストールすると良さそうということが判明
yum install ca-certificates
で、再度 --dry-run
で実施
/bin/certbot renew --force-renew --dry-run
するとうまくいった。
というわけでrenew実行。
/bin/certbot renew --force-renew --post-hook "systemctl reload httpd"
cloudflareまでアクセスが進んだが、エラーが変わって、今度は524エラーだった。
Starting new HTTPS connection (1): api.cloudflare.com
Failed to renew certificate foo.bar with error: 524 Server Error:
どうやら、foo.barにアクセスした際に、timeoutしているみたい
問題を発見するまでに調べていた内容で
certbotは証明書発行の際、サービスのURLにアクセスする際にhttpsではなくhttpでアクセスしてくるらしく
http→httpsのリダイレクトを設定しているとうまく証明書更新ができないらしいよ、という記事を見かけていたので、それかな?と推測
推測したはいいものの、リダイレクトの設定なんかWebサーバーのconfでやってなかった(Apache)
ということは、CloufFlare側の設定かな?と思い、コンソールにログインしてみると、SSLの設定項目の中に以下があった
元々「フル」が選択されており、オリジンサーバーに証明書月リクエストを行なっていたようだったので、今回は「フレキシブル」に変更。
ここでcertbotのrenewを再実行。
/bin/certbot renew --force-renew --post-hook "systemctl reload httpd"
正常に実行されて、サーバーも再起動され、正しくSSLアクセスができることが確認できました。
感想
なんだかんだ1時間半くらいで解決できてよかったけど、夜のLINEは怖いですな。
最近は問題発生したらすぐにQiitaに書いておくようにしているので、この投稿時間が問題の発生時間とほぼ等しいです。
同じことで困っている人がいれば、この記事が助けになっていると嬉しいです。
おやすみなさいー。