HTTP Strict Transport Security (HSTS)


HSTS について調べたまとめ

HSTS とは?

これを読め

私の理解

HSTS

サーバーに http://... の URL でアクセスが来たときに 301 Moved Permanently でスキームだけ https に置換した URL を返すのは、TLS 対応サイトのよくある設定だと思う。 しかし、レスポンスは平文かつ Location も任意の値が設定できるので、悪意ある中間者が好きなサイトに誘導できる (中間者攻撃)。

HSTS とは、具体的な URL を示すのではなく、スキームを https に置換してアクセスするようにブラウザに指示することで、中間者攻撃の危険性を回避する規格。 具体的には次のようなヘッダーを入れる。

Strict-Transport-Security: max-age=<expire-time>
Strict-Transport-Security: max-age=<expire-time>; includeSubDomains

Preload HSTS

これだけではまだ穴がある。初回接続時にクライアントは HSTS 指定を受けていないので、このときだけまだ中間者攻撃のリスクがある。そこで、次のようにブラウザが最初から HSTS なサイトの URL の一覧を持っておく。

[chrome] Contents of /trunk/src/net/http/transport_security_state_static.json

ここに載っているサイトは以下のように preload をつけてよい。

Strict-Transport-Security: max-age=<expire-time>; includeSubDomains; preload

すごく愚直な方法だけど今のところ 1074 行しか無い。もっと増えていくとどうなるの…?

dev ドメイン

.dev などの gTLD ドメインが Google によって購入された。その後、2017 年 9 月から .dev 等の特定のドメインは HSTS が強制されるようになった。 個人で使う分には Netlify や GitHub IO で楽に HTTPS にできるのでそこまで困らないが、プロダクション環境とテスト環境をサブドメインで切り分けるような運用が若干面倒になる。

https://ma.ttias.be/chrome-force-dev-domains-https-via-preloaded-hsts/