| インターネット技術タスクフォース (IETF) | A. Hutton |
| Request for Comments: 7639 | Unify |
| カテゴリー: 標準トラック | J. Uberti |
| ISSN: 2070-1721 | |
| M. Thomson | |
| Mozilla | |
| 2015年8月 |
ALPN HTTP ヘッダーフィールド
概要
本仕様は、HTTP CONNECT リクエストがトンネルが確立された後にトンネル内で使用される予定のプロトコルを、ALPN ヘッダーフィールドを使用して示すことを可能にします。
本メモの状態
これはインターネット標準トラックの文書です。
この文書はInternet Engineering Task Force (IETF) の成果物です。IETF コミュニティの合意を表しています。公開審査を受け、Internet Engineering Steering Group (IESG) によって公開が承認されています。インターネット標準に関するさらなる情報は RFC 5741 のセクション 2 をご覧ください。
この文書の現状、訂正情報、およびフィードバックの送付方法に関する情報は http://www.rfc-editor.org/info/rfc7639 で入手できます。
Copyright Notice
Copyright (c) 2015 IETF Trust and the persons identified as the document authors. All rights reserved.
This document is subject to BCP 78 and the IETF Trust's Legal Provisions Relating to IETF Documents (http://trustee.ietf.org/license-info) in effect on the date of publication of this document. Please review these documents carefully, as they describe your rights and restrictions with respect to this document. Code Components extracted from this document must include Simplified BSD License text as described in Section 4.e of the Trust Legal Provisions and are provided without warranty as described in the Simplified BSD License.
1. 導入
HTTP CONNECT メソッド(Section 4.3.6 of [RFC7231]) は、受信者に指定されたオリジンサーバーへのトンネルを確立し、その後トンネルが閉じられるまで双方向にパケットを転送するよう要求します。こうしたトンネルは、1つまたは複数のプロキシを経由してエンドツーエンドの仮想接続を作成するために一般的に使用されます。
ALPN HTTP ヘッダーフィールドは、クライアントが CONNECT を使って確立されたトンネル内で使用することを意図しているプロトコル(または使用される可能性のあるプロトコル群)を識別します。これは Application-Layer Protocol Negotiation(ALPN)識別子を使用します [RFC7301]。
TLS(Transport Layer Security (TLS) [RFC5246])で保護されるトンネルの場合、ヘッダーフィールドは TLS ハンドシェイク内で使用されるのと同じアプリケーションプロトコルラベルを運びます [RFC7301]。複数の可能なアプリケーションプロトコルがある場合は、それらすべてが示されます。
ALPN ヘッダーフィールドはクライアントの意図を示すだけです。ここで使われる ALPN 識別子は、クライアントがトンネル内で使用することを意図しているアプリケーションプロトコルまたはプロトコル群を識別するためだけのものです。このヘッダーフィールドを用いて交渉は行われません。TLS では最終的なアプリケーションプロトコルの選択はサーバーがクライアントから提示された選択肢の中から行います。他の基盤(substate)ではアプリケーションプロトコルを異なる方法で交渉することがあります。
プロキシはトンネル内のプロトコルを実装しませんが、ヘッダーフィールドの値に基づいてポリシー判断を行う場合があります。例えば、プロキシはアプリケーションプロトコルを使って適切なトラフィック優先度を選択することができます。
1.1. 要件言語
この文書内のキーワード "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", および "OPTIONAL" は、RFC 2119 に記載されているとおりに解釈されます [RFC2119]。
2. ALPN HTTP ヘッダーフィールド
クライアントは、CONNECT リクエストに ALPN ヘッダーフィールドを含めて、トンネル内でクライアントが使用することを意図するアプリケーション層プロトコル、またはトンネル内で使用される可能性のあるプロトコルの集合を示します。
2.1. ヘッダーフィールド値
protocol フィールドの有効な値は、"Application-Layer Protocol Negotiation (ALPN) Protocol ID" レジストリ [ALPN-IDS]([RFC7301] により確立)から取られます。
2.2. 構文
ALPN ヘッダーフィールド値の ABNF(拡張バッカス・ノア形式)構文は以下のとおりです。これは Section 1.2 of [RFC7230] で定義された構文を使用します。
ALPN = 1#protocol-id protocol-id = token ; percent-encoded ALPN protocol identifier
ALPN プロトコル名はオクテット列であり、形式に関する追加の制約はありません。トークンで許可されていないオクテット([RFC7230]、 Section 3.2.6)は、Section 2.1 of [RFC3986] に従ってパーセントエンコーディングされなければなりません。したがって、パーセント文字 "%"(16 進で 25)を表すオクテットもパーセントエンコーディングされなければなりません。
任意の ALPN プロトコル名を正確に一つの方法で表現するために、次の追加制約が適用されます:
- ALPN プロトコル内のオクテットは、"%" を除き、トークン文字として有効であればパーセントエンコードしてはなりません。
- パーセントエンコーディングを使用する場合は、大文字の16進数字を使用しなければなりません。
これらの制約により、受信側はプロトコル識別子を照合するために単純な文字列比較を適用できます。
例えば:
CONNECT www.example.com HTTP/1.1 Host: www.example.com ALPN: h2, http%2F1.1
2.3. 使用法
ALPN ヘッダーフィールドで使用される ALPN 識別子は、単一のプロトコル層やコンポーネントではなく、完全なアプリケーションプロトコルスタックを識別するために使われます。
TLS で保護されたプロトコルを運ぶ CONNECT トンネルの場合、ALPN ヘッダーフィールドの値は TLS ClientHello メッセージで送信されるのと同じ ALPN 識別子のリストを含みます [RFC7301]。
TLS を使用しないなど、プロトコル交渉が発生しないと予想される場合、ALPN ヘッダーフィールドには使用される予定のアプリケーションプロトコルに対応する単一の ALPN プロトコル識別子が含まれます。別の形式のプロトコル交渉が可能な場合、ALPN ヘッダーフィールドには交渉され得るプロトコルの集合が含まれます。
プロキシは ALPN ヘッダーフィールドの値を使用して CONNECT トンネルのリクエストをより明確かつ効率的に拒否することができます。HTTP レイヤーでプロトコル情報を公開することで、プロキシはより早くリクエストを拒否し、(例えば 403 ステータスのような)より良いエラー報告を行うことができます。ALPN ヘッダーフィールドは偽造され得るため、リクエストの認可の根拠としては十分ではありません。
プロキシはパケットを検査して使用中のプロトコルを判断しようとすることができます。これはプロキシが各 ALPN 識別子を理解していることを要求します。TLS のようなプロトコルは交渉されたプロトコルを隠す可能性があり、またプロトコル交渉の詳細は時間とともに変わり得ます。したがって、プロキシはプロトコルを認識できなかったという理由だけで CONNECT トンネルを破壊してはなりません(SHOULD NOT)。
プロキシは接続の管理や優先度付けを変更するために ALPN ヘッダーフィールドの値を使用することができます。
3. IANAの考慮事項
HTTP ヘッダーフィールドは IANA が管理する "Permanent Message Header Field Names" レジストリに登録されます [MSG-HDRS]。本書は ALPN ヘッダーフィールドを定義し、[RFC3864] に従って以下のように登録します:
- Header Field Name:
- ALPN
- Protocol:
- http
- Status:
- Standard
- Reference:
- Section 2 of this document (RFC 7639)
- Change Controller:
- IETF (iesg@ietf.org) - Internet Engineering Task Force
4. セキュリティ上の考慮事項
HTTP CONNECT を TURN(Traversal Using Relays around NAT、[RFC5766])サーバーに対して使用する場合、Section 4.3.6 of [RFC7231] のセキュリティ上の考慮事項が適用されます。同節は「任意のサーバーへのトンネルを確立することには重大なリスクが伴う、特に宛先がウェブトラフィック用ではない既知または予約された TCP ポートである場合はそうである。… CONNECT をサポートするプロキシは、その使用を既知の限られたポート群または安全なリクエスト対象の設定可能なホワイトリストに制限すべきである。」と述べています。
本書で説明する ALPN ヘッダーフィールドは OPTIONAL です。クライアントや HTTP プロキシはこれをサポートしないことを選択でき、その場合は提供しないか、存在しても無視します。ヘッダーフィールドが利用できないか無視される場合、プロキシはトンネルの目的を特定できず、それをトンネルに関する認可判断の入力として使用することはできません。これはクライアントまたはプロキシが ALPN ヘッダーフィールドをサポートしていない場合と区別がつきません。
5. 参考文献
5.1. 規範的参考文献
- [RFC2119]
- Bradner, S., “Key words for use in RFCs to Indicate Requirement Levels”, BCP 14, RFC 2119, DOI 10.17487/RFC2119, March 1997, <http://www.rfc-editor.org/info/rfc2119>.
- [RFC3864]
- Klyne, G., Nottingham, M., and J. Mogul, “Registration Procedures for Message Header Fields”, BCP 90, RFC 3864, DOI 10.17487/RFC3864, September 2004, <http://www.rfc-editor.org/info/rfc3864>.
- [RFC3986]
- Berners-Lee, T., Fielding, R., and L. Masinter, “Uniform Resource Identifier (URI): Generic Syntax”, STD 66, RFC 3986, DOI 10.17487/RFC3986, January 2005, <http://www.rfc-editor.org/info/rfc3986>.
- [RFC7230]
- Fielding, R. and J. Reschke, “Hypertext Transfer Protocol (HTTP/1.1): Message Syntax and Routing”, RFC 7230, DOI 10.17487/RFC7230, June 2014, <http://www.rfc-editor.org/info/rfc7230>.
- [RFC7231]
- Fielding, R. and J. Reschke, “Hypertext Transfer Protocol (HTTP/1.1): Semantics and Content”, RFC 7231, DOI 10.17487/RFC7231, June 2014, <http://www.rfc-editor.org/info/rfc7231>.
- [RFC7301]
- Friedl, S., Popov, A., Langley, A., and E. Stephan, “Transport Layer Security (TLS) Application-Layer Protocol Negotiation Extension”, RFC 7301, DOI 10.17487/RFC7301, July 2014, <http://www.rfc-editor.org/info/rfc7301>.
5.2. 参考資料
- [ALPN-IDS]
- IANA, “Application-Layer Protocol Negotiation (ALPN) Protocol ID”, <http://www.iana.org/assignments/tls-extensiontype-values>.
- [MSG-HDRS]
- IANA, “Permanent Message Header Field Names>”, <https://www.iana.org/assignments/message-headers>.
- [RFC5246]
- Dierks, T. and E. Rescorla, “The Transport Layer Security (TLS) Protocol Version 1.2”, RFC 5246, DOI 10.17487/RFC5246, August 2008, <http://www.rfc-editor.org/info/rfc5246>.
- [RFC5766]
- Mahy, R., Matthews, P., and J. Rosenberg, “Traversal Using Relays around NAT (TURN): Relay Extensions to Session Traversal Utilities for NAT (STUN)”, RFC 5766, DOI 10.17487/RFC5766, April 2010, <http://www.rfc-editor.org/info/rfc5766>.
- [TRAFFIC]
- Pironti, A., Strub, P-Y., and K. Bhargavan, “Identifying Website Users by TLS Traffic Analysis: New Attacks and Effective Countermeasures, Revision 1”, 2012, <https://alfredo.pironti.eu/research/publications/full/identifying-website-users-tls-traffic-analysis-new-attacks-and-effective-counterme>.