自分用のメモ。
#事象
- 次の2つのサイトがあったとする
- サイト1(HTTPS). https://www.example.com/
- サイト2(HTTP). http://www.example.com:8080/
- サイト1.へのアクセス後、サイト2.にアクセスしようとすると、次のHTTPSへのアクセスに自動的に切り替わった。
- サイト3(HTTPS). https://www.example.com:8080/
#原因
サイト1.で、HTTP Strict Transport Security (HSTS) が有効になっていたため。
(「事象が起こっているサイト(サイト2)」ではなく、サイト1.の方に原因があり、すぐには気付けなかった。)
HTTPで"80"以外のポート番号を明示的に指定した場合、意図的にポート番号を保持する("80"の場合は"443"に置き換える)こと、それによって、実はHTTPSへの切り替えが間違いの場合があることも含めて、HSTSの設計時より想定されていた挙動のようである。(RFC6797 の 8.3 および Appendix A.6 を参照のこと。)
#解決
サーバ側およびクライアント側の双方で対応が必要。
(尚、サイト2.のHTTPS化については、今後の課題。)
###サーバ側
サイト1.のHTTP Server にて、HSTSのレスポンスヘッダにおいて、max-age に0に指定1。
Strict-Transport-Security: max-age=0
HSTSのヘッダを削除する方法ではないことに注意。今回の事象が発生した場合、既に、クライアント側のHSTSキャッシュが使われている可能性があり、サーバ側上記手順とクライアント側の手順とを合わせて実施することで、クライアントの「次回」アクセス時に、そのキャッシュが使われないようになる。
###クライアント側
サーバ側で上記対応後、サイト1.にアクセスする2
#[参考資料]
httpでアクセスしたいのにhttpsへリダイレクトされて悩んだ(HSTSまたはStrict-Transport-Securityの沼)
Strict-Transport-Securityヘッダ(HSTS)のキャッシュを無効化する方法
HSTSとは?推奨される理由とプリロードリスト登録方法
RFC6797 - HTTP Strict Transport Security (HSTS)