2. ハンドシェイクプロトコルの拡張
本文書では、[RFC5246]で定義されている拡張メカニズムに従うことで、TLSハンドシェイクプロトコルの拡張を規定します。拡張がクライアントとサーバーの両方でサポートされている場合、既存のTLSハンドシェイクメッセージの構造が拡張されます。
拡張フォーマットは、[RFC5246]のセクション7.4.1.4で定義されています:
struct {
ExtensionType extension_type;
opaque extension_data<0..2^16-1>;
} Extension;
ここで:
ExtensionTypeは拡張タイプを識別します。extension_dataは拡張固有のパラメータを含みます。
拡張は、Client Helloメッセージの拡張フィールドに含めることができます。サーバーがこれらの拡張を理解し、使用に同意する場合、Server Helloメッセージに対応する拡張を含めることができます。
[RFC5246]のセクション7.4.1.4で説明されているように:
- クライアントは、Client Hello内の拡張リストで拡張をリクエストします。
- サーバーは、Server Hello内の拡張リストで拡張を受け入れることを示します。
- サーバーが理解しない拡張を含むClient Helloを受信した場合、サーバーはその拡張を無視してもかまいません(MAY)。
本文書で定義される拡張は、Client HelloおよびServer Helloメッセージの構造を次のように拡張します:
struct {
ProtocolVersion client_version;
Random random;
SessionID session_id;
CipherSuite cipher_suites<2..2^16-2>;
CompressionMethod compression_methods<1..2^8-1>;
select (extensions_present) {
case false:
struct {};
case true:
Extension extensions<0..2^16-1>;
};
} ClientHello;
そして、
struct {
ProtocolVersion server_version;
Random random;
SessionID session_id;
CipherSuite cipher_suite;
CompressionMethod compression_method;
select (extensions_present) {
case false:
struct {};
case true:
Extension extensions<0..2^16-1>;
};
} ServerHello;
extensions_presentが「true」である場合、extensionsフィールドが存在します。このフィールドには、1つ以上の拡張が含まれます。各拡張は、ExtensionTypeとそれに対応するextension_dataで構成されます。
拡張の順序は重要ではありませんが、同じExtensionTypeの拡張が2回以上現れてはなりません(MUST NOT)。
サーバーがClient Helloで提供されたいずれの拡張も理解しないか、使用に同意しない場合、サーバーは拡張なしでServer Helloで応答できます(MAY)。この場合、ハンドシェイクは拡張機能なしで続行されます。
クライアントがServer Helloで、Client Helloでリクエストしていない拡張を受信した場合、クライアントはunsupported_extension致命的アラートでハンドシェイクを中止しなければなりません(MUST)。
本文書の後続のセクションでは、各拡張タイプの具体的な構造と処理ルールを指定します。