HTTP Strict Transport Security (HSTS)
HSTS とは?
これを読んでください。
- cybozu.com を真に常時 SSL にする話
- Strict-Transport-Security - HTTP | MDN
- RFC 6797 - HTTP Strict Transport Security (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 が強制されるようになりました。
個人で使う分には楽に HTTPS にできるのでそこまで困りませんが、仕事だとプロダクション環境とテスト環境をサブドメインで切り分けるような運用が面倒になりそうです。
https://ma.ttias.be/chrome-force-dev-domains-https-via-preloaded-hsts/