スターレンタルサーバー × 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