インターネット技術タスクフォース (IETF) A. Hutton
Request for Comments: 7639 Unify
カテゴリー: 標準トラック J. Uberti
ISSN: 2070-1721 Google
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 ヘッダーフィールドをサポートしていない場合と区別がつきません。

ALPN ヘッダーフィールドには機密性保護がありません。機密またはセンシティブな情報を明らかにするおそれのある ALPN 識別子は送信すべきではありません(SHOULD NOT)。詳細は Section 5 of [RFC7301] を参照してください。

ALPN ヘッダーフィールドの値はクライアントによって偽造される可能性があります。トンネルを通して送信されるデータが暗号化されている場合(例えば TLS [RFC5246] など)、プロキシは主張されたプロトコルが実際に使用されているものかを直接検査して検証できないかもしれませんが、プロキシはトラフィック解析を行える可能性があります [TRAFFIC]。したがって、プロキシはすべての場合において ALPN ヘッダーフィールドの値をポリシーの入力として依存することはできません。

5. 参考文献

著者の連絡先

Andrew Hutton
Unify
Technology Drive
Nottingham, NG9 1LA
United Kingdom
EMail: andrew.hutton@unify.com
Justin Uberti
Google
747 6th Street South
Kirkland, WA 98033
United States
EMail: justin@uberti.name
Martin Thomson
Mozilla
331 East Evelyn Avenue
Mountain View, CA 94041
United States
EMail: martin.thomson@gmail.com