コンテンツにスキップ

HTTPSが静かに失敗するケース

原文

HTTPではリクエストが成功する HTTPSでは静かに失敗する

ログにエラーなし ネットワークエラーもなし

何を見落としたんだ?

要約

HTTPでは動くのにHTTPSで静かに失敗するバグ。エラーログもネットワークエラーも出ない「無音障害」のパターン。混合コンテンツ(Mixed Content)、証明書の問題、TLS終端後のプロキシ設定ミス等が原因として考えられる。

解説

なぜHTTPSで「静かに」失敗するのか

HTTPSが絡む障害は、通常のネットワークエラーと異なりブラウザやクライアントが黙ってリクエストをブロックすることがある。エラーが表示されないため原因特定が難しい。

主な原因と対処法

1. 混合コンテンツ(Mixed Content)

症状: HTTPSページからHTTPリソースをロードしようとしてブロックされる

# NG: HTTPSページからHTTPのAPIを呼ぶ
fetch('http://api.example.com/data')  // ブロックされる(エラーなし)

# OK
fetch('https://api.example.com/data')
  • ブラウザは混合コンテンツをエラーなしでブロックする(コンソールに警告は出る)
  • バックエンドのAPIエンドポイントURLが http:// のままになっていないか確認

2. CORS + HTTPS の組み合わせ

症状: Preflight(OPTIONS)リクエストはHTTPSで通るが、実際のリクエストが静かに失敗

  • TLS終端をするロードバランサー(ALB等)の背後でCORSヘッダーが失われるケース
  • HTTPとHTTPSで異なるオリジンとして扱われる

3. 自己署名証明書 / 証明書エラー

症状: ブラウザはブロックするが、curl -k では通る

  • 開発環境で自己署名証明書を使っている場合、クライアントが証明書エラーを黙って飲む設定になっていることも

4. TLS終端後の内部通信設定ミス

症状: ロードバランサーでTLS終端し、バックエンドへはHTTPで転送するはずが設定ミスで通信が壊れる

クライアント --HTTPS--> ALB --HTTP--> バックエンド
                         ↑ここの設定ミスで静かに失敗

デバッグチェックリスト

  1. ブラウザの開発者ツール → Network タブで実際に送られているリクエストを確認
  2. コンソール → Mixed Content 警告がないか
  3. curl で直接叩くcurl -v https://... で証明書・ヘッダーを確認
  4. プロキシログ → ALB / nginx のアクセスログを確認
  5. リクエストURLのスキーム確認http:// が混在していないか

→ 関連: HTTPSとCDNキャッシュ

リンク