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 Components

1つのWebページに複数のHTML要素サンプルを記述する

1つのWebページに複数のHTML要素サンプルを記述する方法を紹介します。

web development

Webページが読み込む CSS, JS コードから、実際に使われている部分のみを抽出する

Webページが読み込む CSS, JS コードから、実際に使われている部分のみを抽出する方法を紹介します。

Web Vitals

Webページ読み込み高速化に対する<script>タグのdefer/async属性について

Webページ読み込み高速化に対する<script>タグのdefer/async属性について書いています。

Web

AMP for WordPress プラグインを使って WordPressサイトをAMP対応する手順

目次1. AMP とは?なぜ、AMP が必要なのか?AMP フレームワーク1. AMP HTML2. AMP JS3. AMP キャッシュその他2. AMP for WordPress プラグインにつ …

Web Programming

Import maps の使い方

Import maps の使い方について説明します。