SSL Server TestでA+を取るために必要なHTTP Strict Transport Securityヘッダを設定してみたが、サブドメインまで飛ばされてちょいと不都合が起こったので外していた。よく意味が分かってなかったんだが、MDNの資料を見つけたのでこの際に真面目に設定してみる。
HTTP Strict Transport Security -MDN
このヘッダの役割はブラウザがサイトにアクセスしようとした時に、サーバにアクセスする前に、強制的にHTTPSに飛ばすことで中間攻撃を防ごうと言うものです。
今までは、HTTPで暗号化せずにサーバにアクセスし、サーバからHTTPSにリダイレクト要求が来ます。ここで第三者に通信を改ざんされてしまうと折角HTTPS通信をしようとしたのに、悪意のあるサイトに飛ばされたり情報が盗まれたりで台無しです。
これを防ぐためにブラウザでHTTPをHTTPSに置き換えるように指示するのがHSTSヘッダです。しかしこれはHTTPSで一回サーバーにアクセスした後に次回から有効になります。つまり初回HTTPでリダイレクトする必要があります。
さてStrict-Transport-Securityヘッダの設定ですがStrict-Transport-Security: max-age=(有効期間[秒]) (; includeSubDomains )(; preload)
という感じです。
max-ageは有効期間です。これを過ぎるとブラウザでHTTPSにならなくなります。証明書の失効時の対策…と言いたいですが、これはアクセスするたびにカウンタがmax-ageにリセットされます。一ヶ月後に設定しても2週間後にまたアクセスするとそこから一ヶ月後になります。
HTTPアクセスを許可するにはmax-ageを0にします。
includeSubDomainsはサブドメインも適用するということです。
preloadはHSTS Preload list というHTTPSでアクセスすべきサイトリストに登録するときに使います。HSTS Preloaded Listに説明がありますが、ここの手順に沿って設定すると初回アクセス時からHTTPS通信になるようです。どうやらこれブラウザに組み込まれているようですね…。Chromeでは「chrome://net-internals/」のHSTSからいろいろできるので覗いてみてください。