Web

HSTS が原因で、ウェブサイトが勝手にhttps接続しないようにする

投稿日:2019年9月4日 更新日:

1. HSTS という仕様

ウェブには、

特定のドメインに対して、強制的に HTTPS 接続させる(HTTPではなく)

ための RFC 6797 – HTTP Strict Transport Security (HSTS) という仕様があります。

もう少し具体的にいうと、

  1. ブラウザが、https://example.com にアクセスする。
  2. ウェブサーバーが Strict-Transport-Security というレスポンスヘッダを返し、「今後もしこのドメインに http でアクセスしようとしたら、強制的に https で接続し直す」ようブラウザに伝える。
    • このとき、ブラウザは「HSTS適用ドメイン」に example.com を追加します。
  3. これ以降、このブラウザが http://example.com にアクセスしようとすると、代わりに https://example.com にアクセスするようになる。

というものです。

画面1. strict-transport-security レスポンスヘッダ

例えば、ブラウザの「HSTS適用ドメイン」に stackoverflow.com が追加された後で、http://stackoverflow.com にアクセスすると、以下のように「307 Internal Redirect」が行われ、https://stackoverflow.com へのアクセスに切り替わります。

画面2. 307 Internal Redirect

参考

2. HSTS の問題点

このHSTS、以下のようなことが起きるとかなり面倒です。

  1. ある期間、example.com というドメインのウェブサイトを運営しているウェブサーバーが Strict-Transport-Security というレスポンスヘッダを返すよう設定されていました。
  2. その期間中にそのウェブサーバーにアクセスしたブラウザは、ブラウザ内の「HSTS適用ドメイン」に example.com を追加します。
  3. しばらくして、このウェブサイトにおいて「 https でアクセスされると何らかの問題が起きる」ことが発覚したとします。サイト運営者は http でもアクセスできるように、example.com のウェブサーバーが、Strict-Transport-Security レスポンスヘッダを返すのを止めました(これは間違った対応です)。
  4. しかし、ブラウザの「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箇所です。

画面3. Domain Security Policy

(2) まず 「Query HSTS/PKP domain」 のところで、目的のドメインが HSTS を使うドメインとして登録されているか確認します。

Domain」のところに、目的のドメインを入力して [Query] ボタンを押します。

※ ここで入力するドメインは、example.comwww.example.com とは別扱いのようです。

(a) 登録されている場合

登録されていれば、Found: に続いていろいろな情報が表示されます。

(b) 登録されていない場合

登録されていなければ、Not found とだけ表示されます。

(3) 登録されていることが確認できたら、 「Delete domain security policies」のところで、目的のドメインを削除します。

(4) もう一度 「Query HSTS/PKP domain」 のところで、目的のドメインが 登録されていないことを確認します。

Firefox の場合

(1) Ctrl + Shift + H キーを押して、履歴一覧を表示します。

(2) 目的のドメイン履歴を右クリックし、[このサイトの履歴を消去] を選択します。

画面4. ブラウジングライブラリー

以上です。

この操作により、次回からは http でのアクセスもできるようになっているはずです(サーバー側からリダイレクトさせていない場合は)。

Chrome を使って http アクセスし、画面2 のような「307 Internal Redirect」が起きていなければ、HSTS が適用されていないことが分かります。

📂-Web

執筆者:labo


comment

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

関連記事

Chrome

Chrome のアドレスバーから任意のサイトの検索機能を使用する方法

目次1. Chrome の検索エンジン管理機能2. 任意サイトの検索機能を Chrome に追加して使用する1. アルクのサイトで検索したときの URL を調査する2. 検索エンジンとして追加する3. …

Web

ブラウザをキーボードで操作するための拡張機能 Vimium

ブラウザをキーボードで操作するための拡張機能 Vimium について説明します。

Web

rel=”preload” によってリソースを先読みさせる

目次1. rel=”preload” について読み込みは非同期に実行され、レンダリングをブロックしない通常の読み込み処理の記述が別に必要2. デモページ3. その他の特徴as …

HTML

HTML におけるコメントの書き方

HTML におけるコメントの書き方について説明します。 目次1. コメントとは?2. HTML におけるコメントの記述テキストの制限3. 仕様書 1. コメントとは? まず、「コメント」というのは、「 …

Chrome

Chrome で拡張機能を使わずにスクリーンショットを撮る方法

Chrome で拡張機能を使わずにスクリーンショットを撮る方法について説明します。