ForceHTTPS

HSTS (Web)

[4] HSTS (HTTP Strict Transport Security) は、 素のHTTP を用いず、専ら HTTPS のみを用いることを Webサーバーから Webブラウザーに伝達するための仕組みです。 これによって意図せず誤って素のHTTPで当該サーバーに接続することを防ぎ、 素のHTTPを使った攻撃から利用者を護ることを狙いとしています。

[5] 西暦2010年代になって Webブラウザーに実装されると共に、 RFC 6797 として出版されています。

[70] 素のHTTPが安全ではないと考えられるようになった現在、 事実上すべてのサーバーHSTS ヘッダー応答に含めるべきです。

仕様書

概要

[44] HTTPS によって(のみ)提供される Webサーバーでは、 HSTS を使うことにより、もし http: URL で当該サーバー資源が参照されていたとしても、 https: URL に読み替えてアクセスするよう Webブラウザーに要請することができます。

[45] これにより、意図せず素の HTTP によって接続され、 利用者MITM 攻撃などの被害を受けることを防止できます。

[63] HTTP の他、 WebSocket (ws:/wss:) にも適用されます。

脅威モデル

[6] HSTS は、次のような脅威に対処することを想定しています >>3 2.

[10] こうした問題は HTTPS (HTTP over TLS) で解決できるとされていますが、 HTTPHTTPS の両方が提供されていると HTTP 側が脆弱なままになってしまいます。 サーバー側がHTTP を提供していなくても、攻撃者が偽の HTTP サーバーを用意してそこにアクセスさせることが原理的に可能です。 HSTSHTTPS のみ提供し、 HTTP は提供しないことを明確にすることで、 こうした問題を回避しようとしています。

[11] フィッシングの防止や不正なソフトウェアや Webブラウザーの不具合による問題は、 HSTS の対象外です >>3 2.

用語

[66] HSTS や関連仕様で次の用語が定義されています。

ヘッダー

[14] 次のHTTPヘッダーが定義されています。

Strict-Transport-Security: ヘッダー (HTTP)

[18] HTTPStrict-Transport-Security: 応答ヘッダー (通称 STS) は、 当該ホストに関するHSTSポリシーを示すものです >>3 6.1.

[57] 例えば HTTPS応答

Strict-Transport-Security: max-age=2592000; includeSubDomains
... のように指定すると、当該ドメインおよびサブドメインについて、 HSTS が有効になります。この指定は以後30日間 (または上書きされるまで) 有効となります。 max-age の値は、十分大きければ何でも構いません。 もし問題があっても次回アクセス時に新しいヘッダーを指定すれば更新されるので、 新規サイトでは躊躇なく大きな値にできます。

意味

[21] 利用者エージェントがこのヘッダーを含む応答を送ったホストに関するHSTSポリシーを適用しなければならないことを表します >>3 6.1.

文脈

[34] 安全な輸送路上の HTTP にあっては、応答メッセージStrict-Transport-Security: ヘッダーを含めるべきです。 これは複数あってはなりません>>3 7.1.

[35] キャッシュ負荷分散の仕組みなどの都合で一様に付加することが難しいこともあるため、 必須ではなく推奨となっています >>3 7.1.

[36] 安全でない輸送路上の HTTP にあっては、応答メッセージStrict-Transport-Security: ヘッダーを含めてはなりません>>3 7.2.

構文

[22] STS ヘッダーの値は、指令 (directive) の零個以上の列です。指令同士は ; で区切ります。 その前後には LWS も挿入できます。 指令同士の順序は意味を持ちません。 >>3 6.1.

[23] 完全に空になることや、; が先頭や末尾に来ることや、 ; が連続することも認められています。
  1. ?
    1. 指令
    2. *
      1. OWS
      2. ;
      3. OWS
      4. 指令

[24] 指令は名前と値で構成され、両者は = で区切ります。 = と値を省略することもできます。 = の前後には LWS も挿入できます。 >>3 6.1.

[25] 名前は RFC 2616 字句です。 大文字・小文字不区別です。 >>3 6.1.

[27] 同じ名前の指令を複数含めてはなりません>>3 6.1.

[26] 値は RFC 2616字句または引用文字列です。 >>3 6.1.

  1. 字句
  2. =
  3. |
    1. 字句
    2. 引用文字列

[29] 利用者エージェントは、この構文に適合しないヘッダーを無視しなければなりません>>3 6.1.

[30] 利用者エージェントは、認識できない指令を無視し、 認識できる指令を処理しなければなりません>>3 6.1.

処理

[86] 混合内容の処理に影響することがあります。

指令

[32] Strict-Transport-Policy: ヘッダーには次の指令があります。

[31] 追加の指令が必要になった時には IETF Review を経て追加する IANA登録簿が用意されることとされています。 >>3 6.1. 現時点ではIANA登録簿は存在しません。

[33] max-age必須です。

サーバーの処理

[48] HTTPサーバーの実装は、 HSTS に対応しなければなりません >>47

[303] サーバーは、安全な輸送路要求を受け取った時は、 Strict-Transport-Security: ヘッダーを送るべきです。

[50] サーバーは、 HSTS を使って TLS のみのクライアントを受け入れる意思があることを示すべきです。 ただし、 HSTS を使うとむしろ安全でなくなる場合 (例えば自己署名証明書を使っている場合) は除きます。 >>47

[37] サーバーは、安全でない輸送路要求を受け取った時は、 301 などの永続的なリダイレクトを表す応答メッセージを返すべきです。 この時 Location: ヘッダーには、元の実効要求URLURL schemehttps: に変えたものか、 その他何らかの方法で決めた https: URL を指定したものとするべきです>>3 7.2.

[302] 必須でなく推奨であるのは、サーバー側の構成上の都合でそう設定できない場合があり得ることや、 リダイレクトの存在によって攻撃の危険性が生じることを避けたい場合を考慮しているようです。 >>3 7.2.
[46] 一旦 WebブラウザーHSTS を受信すると、 (既知HSTSホストである間は) そのサーバーに素の HTTP で接続することはできなくなります。 ですから、 HSTS を使う場合には、素の HTTPサーバーHTTPSリダイレクトする以外の機能を提供しても意味がありません。

利用者エージェントの処理

[49] HTTPクライアントの実装は、 HSTS に対応しなければなりません >>47

[304] 利用者エージェント応答メッセージStrict-Transport-Security: ヘッダーを次のようにしなければなりません >>3 8.1., >>8.4.

  1. [305] 安全でない輸送路なら、無視します。
  2. [308] 安全な輸送路に関する誤り警告があれば、無視します。
  3. [306] 複数のヘッダーがあれば、最初のもののみを処理し、他は無視します。
  4. [307] 構文的に正しくなければ、無視します。
  5. [312] 合同一致する既知HSTSホストを探します。

[445] Strict-Transport-Security: ヘッダーが指定されていないからといって既知HSTSホストから削除してはいけません。

[446] 利用者エージェントhttp: URL による HTTP要求を送信するに当たり、 既知HSTSホストの情報に基づき書き換えを行います。

main fetch 参照。

[61] 利用者エージェントWebSocketコンストラクターの処理で HSTS を適用しなければなりません。

[444] 利用者エージェントは、 既知HSTSホスト接続する際に、 安全な輸送路誤り警告があれば、接続を終端しなければなりません >>3 8.3.

[62] その方法として fatal alert を使うべきなのか、通常の終了でもいいのかは定かではありません。

セキュリティー

[52] HSTS は、 fingerprinting vector です。

[39] Webブラウザーは、HSTSスーパークッキー脆弱性に注意が必要です >>51

ポート

[59] HSTSドメインまたはドメインおよびサブドメイン群に対する指定なので、 すべてのポートに適用されます。

関連

[75] Upgrade-Insecure-Requests: も参照。

[78] iOS には ATS なる仕組みが存在します。

[79] HSTS の処理は、混合内容の検査よりも後に実行されます (main fetch 参照)。ですから HSTS が有効になっていたとしても、 http: URL が指定されていると、読み込みエラーとなります。

[80] UIR の処理は、混合内容の検査よりも先に実行されます (main fetch)。 従って http: URL を使った既存の文書との互換性を保ちたいときは、 HSTS だけでなく UIR を使えば良いのです。ただし、 UIR格上げされる条件には制約がありますから、注意が必要です (main fetch 参照)。

歴史

Fetch との統合

[448] Re: Redirects and HSTS ( (Anne van Kesteren 著, 版)) http://lists.w3.org/Archives/Public/public-webappsec/2014Sep/0110.html

[38] Fix the order of CSP, HSTS, Mixed Content, and Referrer https://www.w3.o... · b8c2c49 · whatwg/fetch ( 版) https://github.com/whatwg/fetch/commit/b8c2c4964c233cd3616042c04e2c14e0ff25485d

Web Sockets への適用

[449] 664284 – Add HSTS support for websockets ( ( 版)) https://bugzilla.mozilla.org/show_bug.cgi?id=664284

[450] [chrome] Revision 82069 ( ( 版)) http://src.chromium.org/viewvc/chrome?revision=82069&view=revision

[451] Bug 27554 – After the WebSocket object is returned we should probably integrate with HSTS. For Fetch that happen [...] ( ( 版)) https://www.w3.org/Bugs/Public/show_bug.cgi?id=27554

HSTS スーパークッキー問題

[452] RadicalResearch HSTS Super Cookies ( ( 版)) http://www.radicalresearch.co.uk/lab/hstssupercookies/

[453] Issue 104935 - chromium - Security: HSTS "cookies" do not obey expected policy. - An open-source project to help move the web forward. - Google Project Hosting ( ( 版)) https://code.google.com/p/chromium/issues/detail?id=104935

[454] Issue 258667 - chromium - HSTS pins and HSTS metadata stored even when cookies are rejected - An open-source project to help move the web forward. - Google Project Hosting ( ( 版)) https://code.google.com/p/chromium/issues/detail?id=258667

[455] Chrome Fixes STS Privacy Issue ha.ckers.org web application security lab ( ( 版)) http://ha.ckers.org/blog/20100413/chrome-fixes-sts-privacy-issue/

実装

[447] HSTS Preload Submission ( ( 版)) https://hstspreload.appspot.com/

[40] UPGRADE: Relation to HSTS. · df9adb8 · w3c/webappsec ( 版) https://github.com/w3c/webappsec/commit/df9adb8910b1b09b72dce5cc999b3b725fbcd4f3

[41] Preloading HSTS | Mozilla Security Blog ( 版) https://blog.mozilla.org/security/2012/11/01/preloading-hsts/

[42] [chrome] Contents of /trunk/src/net/http/transport_security_state_static.json ( 版) https://src.chromium.org/viewvc/chrome/trunk/src/net/http/transport_security_state_static.json

[43] HTTP Strict Transport Security comes to Internet Explorer - IEBlog - Site Home - MSDN Blogs ( 版) http://blogs.msdn.com/b/ie/archive/2015/02/16/http-strict-transport-security-comes-to-internet-explorer.aspx

[55] Strict Transport Security - IEInternals - Site Home - MSDN Blogs ( 版) http://blogs.msdn.com/b/ieinternals/archive/2014/08/18/hsts-strict-transport-security-attacks-mitigations-deployment-https.aspx

[56] HTTP Strict Transport Security comes to Internet Explorer - IEBlog - Site Home - MSDN Blogs ( 版) http://blogs.msdn.com/b/ie/archive/2015/02/16/http-strict-transport-security-comes-to-internet-explorer.aspx

[58] HTTP Strict Transport Security comes to Internet Explorer - IEBlog - Site Home - MSDN Blogs ( 版) http://blogs.msdn.com/b/ie/archive/2015/02/16/http-strict-transport-security-comes-to-internet-explorer.aspx

[60] Apply HSTS to WebSocket · whatwg/html@8b46c20 ( 版) https://github.com/whatwg/html/commit/8b46c205cc2b54bb4d57bd7ad12baf9492e40edd

[64] HTTP Strict Transport Security - The Chromium Projects ( 版) https://www.chromium.org/hsts/

[65] google chrome - HSTS Preload list からドメインを削除したい - スタック・オーバーフロー ( 版) http://ja.stackoverflow.com/questions/9510/hsts-preload-list-%E3%81%8B%E3%82%89%E3%83%89%E3%83%A1%E3%82%A4%E3%83%B3%E3%82%92%E5%89%8A%E9%99%A4%E3%81%97%E3%81%9F%E3%81%84

[67]

Strict-Transport-Security: max-age=10886400; includeSubDomains; preload

[68] HSTS Priming ( 版) https://mikewest.github.io/hsts-priming/

This document proposes modifications to Strict Transport Security’s behavior in order to mitigate the risk that mixed content blocking will prevent migrations from HTTP to HTTPS.

[69] HSTS Priming, continued. (Mike West 著, 版) https://lists.w3.org/Archives/Public/public-webappsec/2015Nov/0003.html

[71] Editorial: remove HSTS reference · whatwg/html@96be6c0 ( 版) https://github.com/whatwg/html/commit/96be6c02315d677c48ac334a689a48cbd1929c95

[72] Fix #244: improve HSTS language · whatwg/fetch@6568ab8 ( 版) https://github.com/whatwg/fetch/commit/6568ab88c1fbfb581f63f8e5f020c367ef38e78d

[73] GitHub ( 版) https://github.com/

Strict-Transport-Security:max-age=31536000; includeSubdomains; preload

[74] Twitter ( 版) https://twitter.com/

strict-transport-security:max-age=631138519

[77] 921907 – Enable OCSP must-staple feature ( ()) https://bugzilla.mozilla.org/show_bug.cgi?id=921907

Bug #901698 seems to be more about the HSTS-style Must-Staple, not the x509v3 extension. That work seems to be stalled, because it suffers from the first-connection problem or scalability issues if Must-Staple preload lists have to be distributed.

[81] Google Online Security Blog: Bringing HSTS to www.google.com ( ()) https://security.googleblog.com/2016/07/bringing-hsts-to-wwwgooglecom.html

[82] Strict Transport Security ( 版) http://lists.w3.org/Archives/Public/www-archive/2009Dec/att-0048/draft-hodges-strict-transport-sec-06.plain.html

[83] Creating Safari Content-Blocking Rules () https://developer.apple.com/library/content/documentation/Extensions/Conceptual/ContentBlockingRules/CreatingRules/CreatingRules.html#//apple_ref/doc/uid/TP40016265-CH2-SW1

make-https

Changes a URL from http to https before making a server request. URLs with a specified port (other than the default port 80) and links using other protocols are not affected.

[84] should BroadcastChannel be disabled if a window does not have access to storage? · Issue #3054 · whatwg/html () https://github.com/whatwg/html/issues/3054

[85] Protecting Against HSTS Abuse | WebKit () https://webkit.org/blog/8146/protecting-against-hsts-abuse/

[87] Making .gov More Secure by Default | DotGov () https://home.dotgov.gov/management/preloading/dotgovhttps/

[88] GNU Wget 1.20 Manual () https://www.gnu.org/software/wget/manual/wget.html#index-HSTS