スターレンタルサーバー × Cloudflare × サブドメインで Let’s Encrypt が発行できなかった原因と解決メモ
Cloudflareで取得した独自ドメインをスターレンタルサーバーで使用し、サブドメインに対して無料SSL(Let’s Encrypt)を発行しようとしたところ、サブドメインだけが発行失敗する問題が発生しました。原因を調査し解決できたため記録します。
発生した現象
- 親ドメインのSSLは問題なく発行済み
- サブドメインに限り Let’s Encrypt が失敗
- スターレンタルサーバーの管理画面で以下が表示:
Let’s Encrypt証明書の発行に失敗しました
調査内容
1. DNS設定 → 正常
digコマンドで確認したところサブドメインは正しくサーバーIPへ向いており問題なし。
2. 認証アクセス → サーバーに届いていた
スターレンタルサーバー側ログに次のようなアクセスが確認できた:
GET /.well-known/acme-challenge/... "Let's Encrypt validation server"
3. 一部アクセスが301リダイレクトされていた
ログ内に 301 Moved Permanently 応答があり、認証URLがHTTPSへリダイレクトされていることが判明。
原因
.htaccess の強制HTTPS設定が Let’s Encrypt の認証URLまで作用していた
スターレンタルサーバーの親ディレクトリに以下の .htaccess があり、サブディレクトリにも継承されていました。
RewriteEngine on
RewriteCond %{HTTPS} !on
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
この設定により、Let’s Encrypt が必要とする HTTPアクセス(HTTP-01認証)が HTTPSへ強制的にリダイレクトされてしまい、認証処理が成立しなくなっていました。
解決方法
/.well-known/acme-challenge/ へのアクセスのみリダイレクト対象外にする設定を追加。
修正後の .htaccess:
RewriteEngine on
# Let's Encrypt 認証URLはHTTPSへリダイレクトさせない
RewriteCond %{REQUEST_URI} ^/\.well-known/acme-challenge/
RewriteRule ^ - [L]
# それ以外はHTTPSへ強制
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
この修正後にSSL発行を再実行したところ、正常に完了しました。
補足:curl とブラウザで挙動が異なった理由
| ツール | 動作 |
|---|---|
| curl | HSTSを理解しないためHTTPのまま応答を確認できた |
| ブラウザ(Chrome / Edge) | CloudflareのHSTSにより初回からHTTPSへ内部リダイレクト |
そのためブラウザでは常にHTTPSで開かれ、設定が正しいか判断しづらい状態になっていました。
まとめ(結論)
今回の原因は次の通りです:
親ディレクトリの .htaccess が HTTP → HTTPS を強制しており、Let’s Encrypt の認証URL(/.well-known/acme-challenge/)までリダイレクトされていたことが失敗の理由でした。
認証URLだけ例外処理を追加することで、SSL発行は正常に完了しました。
同じ構成(スターレンタルサーバー × Cloudflare × サブドメインSSL)で詰まる方がいると思うので、備忘録として残します。スターレンタルサーバーはエックスサーバーのシステムをベースにしているため、同様の構成で運用しているエックスサーバー利用者にも参考になる内容だと思います。
Discussion