HTTPで接続した際に、強制的にHTTPSへリダイレクトし、以降のそのドメインへの接続はすべてHTTPSとする機能がHSTS (HTTP Strict Transport Security) である。RFC6797で標準化されている。
これはHTTPヘッダに以下を含むことで実現される。
Strict-Transport-Security:max-age=有効期間秒数;includeSubDomains
max-ageではHTTPSで通信する期間を設定する。また、includeSubDomainsを指定することで、サブドメインにもHSTSが適用されるように設定できる。
HSTSのサポートは、2015年6月9日にマイクロソフトがIEへのサポートを追加したことで、すべてのメジャーブラウザにおいてサポートが完了し、HTTPサーバーとしてもApacheを始めとし設定が可能だ。
Apacheの設定
Apacheにおいては、以下のバーチャルホストの設定になる。
ここではexample.comのサブドメインすべてにHSTSが適用されるように設定されており、365日(31,536,000秒)が有効期間である。
<VirtualHost *:443>
ServerName example.com
SSLEngine on
Header set Strict-Transport-Security "max-age=31536000; includeSubDomains"
</VirtualHost>`
その他のHTTPサーバーの設定
IPA(情報処理推進機構)のSSL/TLS暗号設定ガイドライン~安全なウェブサイトのために(暗号設定対策編)~ のAppendix B.4. HTTP Strict Transport Security(HSTS)の設定方法例を参照。
Preloaded HSTS
HSTSを用いても、最初の接続にHTTPを用いる限り、完全なセキュリティは実現されない。これを解決するために、ChromeではPreloaded HSTS、すなわち最初からブラウザにHSTSを組み込めば良い。これはブラウザ本体にHSTSで接続するドメインのリストを持つことにより実現できる。
Chromeに組み込まれたPreloaded HSTSはここで参照できる。
また、ChromeのPreloaded HSTSに組み入れるためには、こちらから申請する。
特定のドメインがPreloaded HSTSとして登録されているかどうかの確認はChromeのアドレスバーにchrome://net-internals/#hsts
を入力し表示されるChrome Net-Internalsのページから確認することもできる。"Query domain"にドメイン名を入力し、QueryをすることでHSTS情報を得ることができる。以前に訪れたドメインの場合は、"Delete domain"でそのドメインを一度削除すると良い。
参考情報
- RFC6797 HTTP Strict Transport Security (HSTS)
- cybozu.com を真に常時 SSL にする話 | Cybozu Inside Out | サイボウズエンジニアのブログ
- The Chromium Project HTTP Strict Transport Security
- HTTP Strict Transport Security comes to Internet Explorer 11 on Windows 8.1 and Windows 7
- IPA(情報処理推進機構) SSL/TLS暗号設定ガイドライン~安全なウェブサイトのために(暗号設定対策編)~