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マップで調べた経路をホーム画面に追加する (Android)

Android版の Googleマップで調べた経路は、ホーム画面にアイコンとして追加することができます。 手順は以下となります。 Google マップで調べた経路をホーム画面に追加する手順 (1) G …

プライバシー

ウェブブラウザのサードパーティ・クッキーを無効にする方法

目次1. サードパーティ・クッキーとは?2. サードパーティ・クッキーを無効にする手順Chrome の場合Firefox の場合Microsoft Edge の場合Internet Explorer …

Web

【HTML】img 要素の srcset 属性 と sizes 属性について

目次1. デバイスピクセル比2. img 要素の srcset 属性 と sizes 属性3. sizes 属性4. srcset 属性x 単位で画像ファイルのサイズを指定する場合w 単位で画像ファイ …

CSS

CSS の基礎

目次1. CSS とは?2. CSS のバージョン(分類)Cascading Style Sheets, level 1Cascading Style Sheets, level 2 (CSS2)Ca …

Web

Basic認証の設定手順

Basic認証の設定手順について説明します。