No.433


【Let's Encrypt】証明書の更新に失敗した場合の確認事項

firewallなどの問題は無いのになぜ…

 とある客のコーポレートサイトのお仕事。WEB周りの環境の運用も落ち着いてきた矢先、客から「不正な証明書のサイトって言われるんですけどぉ」と連絡が来た。

 証明書が古くなっていることが原因なのはブラウザから証明書情報を見て分かった。だけど原因が分からない。ひとまずLet's Encryptからのメールを確認すると下記のエラーが記録されていた。

Timeout during connect (likely firewall problem) 

 結論として .htaccess の記述が原因だった。
 今後も同じことが起きえるので原因調査と解決をメモしておく。


ファイアーウォール

 firewallでポート80を開けてないという単純なミスがまず考えられる。

 firewalld iptable などを確認する。
 それ以外にもVPSのコントロールパネルなどのセキュリティ設定でふさがれているときもあるので、そちらも忘れずに確認しよう。

 まあ、公開しているWEB環境でこれはないとは思う。うちも違った。


httpsへのリダイレクト

 あとからhttps化したサイトにありがちな問題。本件もこれだった。

 .htaccess に下記のような記述を加えてhttpをhttpsにredirectさせているケース。

RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R,L]

 Let's Encryptは http へ接続してサイトの存在確認を行うため、上記の設定だと http://ドメイン名/.well-known/acme-challenge へのアクセスが成立しないと見なされてしまい、失敗となってしまう。

 httpsのアクセスくらい許してくれよとは思うが、そういうポリシーのサービスなのでしょうがない。下記のように除外設定を入れて対応しよう。

RewriteEngine On
RewriteCond %{HTTPS} off
RewriteCond %{REQUEST_URI} !^/.well-known/acme-challenge/
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R,L]