1. HSTS という仕様
ウェブには、
ための RFC 6797 – HTTP Strict Transport Security (HSTS) という仕様があります。
もう少し具体的にいうと、
- ブラウザが、
https://example.com
にアクセスする。 - ウェブサーバーが
Strict-Transport-Security
というレスポンスヘッダを返し、「今後もしこのドメインに http でアクセスしようとしたら、強制的に https で接続し直す」ようブラウザに伝える。- このとき、ブラウザは「HSTS適用ドメイン」に
example.com
を追加します。
- このとき、ブラウザは「HSTS適用ドメイン」に
- これ以降、このブラウザが
http://example.com
にアクセスしようとすると、代わりにhttps://example.com
にアクセスするようになる。
というものです。
例えば、ブラウザの「HSTS適用ドメイン」に stackoverflow.com
が追加された後で、http://stackoverflow.com
にアクセスすると、以下のように「307 Internal Redirect」が行われ、https://stackoverflow.com
へのアクセスに切り替わります。
参考
2. HSTS の問題点
このHSTS、以下のようなことが起きるとかなり面倒です。
- ある期間、
example.com
というドメインのウェブサイトを運営しているウェブサーバーがStrict-Transport-Security
というレスポンスヘッダを返すよう設定されていました。 - その期間中にそのウェブサーバーにアクセスしたブラウザは、ブラウザ内の「HSTS適用ドメイン」に
example.com
を追加します。 - しばらくして、このウェブサイトにおいて「 https でアクセスされると何らかの問題が起きる」ことが発覚したとします。サイト運営者は http でもアクセスできるように、
example.com
のウェブサーバーが、Strict-Transport-Security
レスポンスヘッダを返すのを止めました(これは間違った対応です)。 - しかし、ブラウザの「HSTS適用ドメイン」には
example.com
が登録されたままであるため、相変わらず https でしかアクセスできません。
本来 HSTS を止めようとするのであれば、サーバー側で Strict-Transport-Security
ヘッダのところに max-age=0
を指定すればよいのですが、 上記のように Strict-Transport-Security
ヘッダそのものを消されてしまうと、 ブラウザを利用しているユーザーが異変を察知して、example.com
が HSTS を使わないように設定変更するしかありません。
参考:5.3. HSTS Policy Storage and Maintenance by User Agents | RFC 6797 – HSTS
しかも、ブラウザにおいて「特定のドメインに対する HSTS 設定を削除する」方法が普通の設定画面ではできないのです(簡単に設定変更できるブラウザがひょっとしたらあるかもしれませんが)。次でそのやり方を説明します。
3. 特定のドメインのHSTS設定を削除する
主なブラウザでの「特定のドメインのHSTS設定を削除する」方法を紹介します。
Chrome の場合
(1) アドレスバーから「chrome://net-internals/#hsts
」にアクセスします。
使うのは、「Query HSTS/PKP domain」と「Delete domain security policies」の2箇所です。
(2) まず 「Query HSTS/PKP domain」 のところで、目的のドメインが HSTS を使うドメインとして登録されているか確認します。
「Domain」のところに、目的のドメインを入力して [Query] ボタンを押します。
※ ここで入力するドメインは、example.com
と www.example.com
とは別扱いのようです。
(a) 登録されている場合
登録されていれば、Found: に続いていろいろな情報が表示されます。
(b) 登録されていない場合
登録されていなければ、Not found とだけ表示されます。
(3) 登録されていることが確認できたら、 「Delete domain security policies」のところで、目的のドメインを削除します。
(4) もう一度 「Query HSTS/PKP domain」 のところで、目的のドメインが 登録されていないことを確認します。
Firefox の場合
(1) Ctrl + Shift + H キーを押して、履歴一覧を表示します。
(2) 目的のドメイン履歴を右クリックし、[このサイトの履歴を消去] を選択します。
以上です。
この操作により、次回からは http でのアクセスもできるようになっているはずです(サーバー側からリダイレクトさせていない場合は)。
Chrome を使って http アクセスし、画面2 のような「307 Internal Redirect」が起きていなければ、HSTS が適用されていないことが分かります。