Let's Encryptの自動更新がエラーになっていた
2017年頃から運用しているサーバーで、毎日cronで
certbot-auto renew
を実行していた。
しかし、今月に入ってLet's encryptから証明書の期限(2018-12-26)が近づいてきたというメールが届いた。
サーバーに入って確認してみると80番ポートが空いてないよーというエラーで止まっていた。
Cert is due for renewal, auto-renewing... Plugins selected: Authenticator apache, Installer apache Renewing an existing certificate Performing the following challenges: http-01 challenge for xxx Cleaning up challenges Attempting to renew cert (xxx) from /etc/letsencrypt/renewal/xxx.conf produced an unexpected error: Unable to find a virtual host listening on port 80 which is currently needed for Certbot to prove to the CA that you control your domain. Please add a virtual host for port 80.. Skipping. All renewal attempts failed. The following certs could not be renewed: /etc/letsencrypt/live/xxx/fullchain.pem (failure)
あれ、もともと空けてないし443だけで動かなかったっけと思って調べると、今年頭にTLS-SNI検証に脆弱性が発見されたという情報があった。
この時点では新規取得が無効化されただけだったため特に影響は受けなかったが、どうやら最近のcertbotで更新時のTLS-SNI検証が効かなくなった可能性がある。
80番ポートを開ければ解決だが、重要度の低いサーバーについて取引先に質問を投げてやり取りが発生するのも面倒なのでひとまず一瞬だけポートを空けて更新して閉じることで取り急ぎ解決。
、、、というだけだと毎回同じ作業をすることになるのでもう少し調べてみる。
どうやら
certbot-auto renew --preferred-challenge tls-sni
というオプションで解決できそうだったことがわかったが(デフォルトが変更されただけ?)、いずれにせよ2019年2月13日にtls-sni-01は無効化されるとのこと。
DNS-01かHTTP-01の検証方式に移行しましょうということだが、TLS-ALPN-01というのが気になる。
上記にもあるようにtls-sni-01/02の問題を解決した手法ということで移行先としてはTLS-ALPNが正しそうだが推奨していないのはドラフトだからだろうか。
tls-sniはサーバーを共用している状況で問題が出たとのことだが新しいプロトコルでそれより酷い脆弱性は出ないだろうと楽観的に予想して、crontabのコマンドは
/opt/certbot-auto renew --preferred-challenges tls-alpn-01
と書き換えて次回の更新まで様子見してみることにした。