HSTSによる強制HTTPS無間地獄にどハマりした件

サイトの完全SSL化でアレコレ試しているうちに、メインサイトとは無関係のサブドメインまで勝手にHTTPSでのアクセスになったり、どう設定を変えてもHSTSを要求されるようになってしまった。

具体的には、下記のメッセージがどうやっても消えないという状態だ。

このサイトでは、暗号化された通信のみで接続するよう Firefox に指定する HTTP Strict Transport Security (HSTS) が使われています。そのため、この証明書を例外に追加することはできません。

試行錯誤した結果、完全SSL化の試行錯誤の途中で付けた下記のヘッダが、この悪さをしていたということがわかった。

add_header Strict-Transport-Security "max-age=31536000; includeSubDomains;";

このヘッダが付いたサイトにブラウザがアクセスすると、次回から強制的にHTTPSで接続するように覚え込んでしまう。

そして、この記述には2つの罠が潜んでいた。 一つ目はincludeSubDomains。 これで、このServerディレクティブに指定しているドメインの、全てのサブドメインが対象になってしまうのだ。 オレの場合はnakayan.jpという設定になっているので被害甚大。 全てのサブドメインが強制的にHTTPSでのアクセスになるのに、SSLの証明書はnakayan.jp用だからサブドメインへのアクセスは全部「不正な証明書」ということで使えなくなった。

じゃぁ、このincludeSubDomainsを消せば良いかと言うとそうでもなく、今度はmax-age=31536000があるので、このヘッダを消してもブラウザは命令を忘れず、律儀に1年間は強制的にHTTPSで接続しようとするという・・・。

と言うことで、下記の通り書き換えてあげることで、ブラウザが覚えている設定をリセットできた。

add_header Strict-Transport-Security max-age=0;

正常にサブドメインにアクセスできることを確認したら、元通りのmax-age=31536000に書き戻してあげればOKだ。 幸いにして我が家のサブドメインは全て内部向けだったので事なきを得たが、もしサブドメインも外部に公開していて、このヘッダ問題に気付くまでに相当のアクセスがあったのだとしたら、アクセスしてきた多くのブラウザがリセットされるまでは、設定を書き戻さない方が良い。

ということで結論。

HSTSで強制的にHTTPSになる時は、Strict-Transport-Securityヘッダを疑え。

いやぁ、これにはハマったわー。

All original content on these pages is fingerprinted and certified by Digiprove