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

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

関連記事

Web

Notification API のポイント解説

目次1. はじめにNotification API が行うこと補足2. Notification API の使い方(1) デスクトップ通知が許可されているかどうかを取得する。(2) ユーザーにデスクト …

no image

HTML文書の文字エンコーディングに UTF-8 を使うことが公式に明文化されました

HTML文書は文字エンコーディングUTF-8でなければなりません – 水底の血 という記事で知ったのですが、「HTML文書の文字エンコーディングは UTF-8 でなければならない」という意 …

CSS

【CSS】kbd 要素には “white-space: nowrap” を指定しましょう

kbd 要素に何も指定しないと、以下のように途中で改行されてしまうことがあります。 before 通常の状態 これを避けるために、kbd 要素に対して “white-space: nowr …

SQLite

PHP から SQLite を使う手順

PHP から SQLite を使う手順について説明します。

Web

Material の Icons (アイコン)を導入する手順

2020年8月:Material design icons 側に変更があり、手順が変わってしまったようです。 目次1. はじめに2. Icons の導入手順2-1. Google Web Fonts …