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

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

関連記事

Google

【Google】アカウント無効化管理ツールの設定

Google の「アカウント無効化管理ツール」について説明します。

SQLite

PHP + SQLite を利用してアクセスカウンターを作る

PHP + SQLite を利用してアクセスカウンターを作ります。

Chrome

ブロックされた Cookie を確認する方法 (Chrome の場合)

Chrome ブラウザにおいて、ブロックされた Cookie を確認する方法について説明します。

Google

Google マップの便利な機能

目次1. はじめに2. Googleマップの便利な機能3. 経路検索(ルート検索)経路をホーム画面に追加4. 運転モード5. マイプレイス6. 印刷 1. はじめに Googleマップ はとても便利な …

Chrome

Chrome 78 デベロッパーツールの新機能

Chrome 78 のデベロッパーツールにおいて、主な新機能を紹介します。