[2] [DFN[[[TLS Handshake Protocol]]]] は、 [[TLSセッション]]の[[折衝]]に関する責任を負うものです [SRC[>>1]]。
[[TLS]] の[[接続]]は、 [[TLS Handshake Protocol]] によって[[クライアント]]と[[鯖]]の間で[[暗号化]]方式その他の折衝を行うことにより、確立されます。

* 仕様書

[REFS[
- [1] [CITE@en[RFC 5246 - The Transport Layer Security (TLS) Protocol Version 1.2]] ([TIME[2015-02-19 08:58:15 +09:00]] 版) <http://tools.ietf.org/html/rfc5246#section-7>
-- [3] [CITE@en[RFC 5246 - The Transport Layer Security (TLS) Protocol Version 1.2]] ([TIME[2015-02-19 08:58:15 +09:00]] 版) <http://tools.ietf.org/html/rfc5246#section-7.3>
- [9] [CITE[Transport Layer Security (TLS) Parameters]] ([TIME[2015-02-27 12:03:35 +09:00]] 版) <http://www.iana.org/assignments/tls-parameters/tls-parameters.xhtml#tls-parameters-7>
]REFS]

* プロトコル

[4] 完全なフローは、次のように[[メッセージ]]のやり取りを行います。
[FIG(sequence)[
:C:[[クライアント]]
:S:[[鯖]]
:C ## S:[[下位層プロトコル]]の[[接続]]の確立
:C -> S:[CODE[[[ClientHello]]]]
:S -> C:[CODE[[[ServerHello]]]]
:S -> C:[CODE[[[Certificate]]]] (必要な場合)
:S -> C:[CODE[[[ServerKeyExchange]]]] (必要な場合)
:S -> C:[CODE[[[CertificateRequest]]]] (必要な場合)
:S -> C:[CODE[[[ServerHelloDone]]]]
:C -> S:[CODE[[[Certificate]]]] (必要な場合)
:C -> S:[CODE[[[ClientKeyExchange]]]]
:C -> S:[CODE[[[CertificateVerify]]]] (必要な場合)
:C -> S:[CODE[[[ChangeCipherSpec]]]]
:C -> S:[CODE[[[Finished]]]]
:S -> C:[CODE[[[ChangeCipherSpec]]]]
:S -> C:[CODE[[[Finished]]]]
:C ## S:[[応用データ]]の送受信
]FIG]

[5] [[セッション再開]]の場合は、次のように大幅に簡略化された[[メッセージ]]のやり取りを行います。
[FIG(sequence)[
:C:[[クライアント]]
:S:[[鯖]]
:C ## S:[[下位層プロトコル]]の[[接続]]の確立
:C -> S:[CODE[[[ClientHello]]]] ([[セッション識別子]]付き)
:S -> C:[CODE[[[ServerHello]]]]
:C -> S:[CODE[[[ChangeCipherSpec]]]]
:C -> S:[CODE[[[Finished]]]]
:S -> C:[CODE[[[ChangeCipherSpec]]]]
:S -> C:[CODE[[[Finished]]]]
:C ## S:[[応用データ]]の送受信
]FIG]

[6] これらのフローは[[クライアント]]が新たな [[TLS]] の[[接続]]を開始した時の他に、
[[鯖]]が [CODE[[[HelloRequest]]]] を送信して[[クライアント]]が受信した時にも実行されます。

[13] [[証明書]]に関する拡張機能で [CODE[[[CertificateURL]]]] [[メッセージ]]や
[CODE[[[CertificateStatus]]]] [[メッセージ]]が使われることがあります。

[10] [[セッション再開]]に関する拡張機能で [CODE[[[NewSessionTicket]]]]
[[メッセージ]]が使われることがあります。

[11] 追加データの提供のために [CODE[[[SupplementalData]]]] [[メッセージ]]が使われることがあります。

[8] [[DTLS]] では [CODE[[[hello_verify_request]]]] [[メッセージ]]があります。

[14] [[HTTPS]] も参照。

* handshake メッセージ型

[7] [[Handshake protocol]] の[[メッセージ]]の種類は、 [DFN[[CODE[[[msg_type]]]]]]
欄の値により決まります。

[15] [CODE[[[msg_type]]]] [[欄]]に設定する 
[DFN[[CODE[HandshakeType]]]]
の値には、[[IANA登録簿]] (>>9) があります。

- [N[1]] [CODE[client_hello]]
- [N[2]] [CODE[server_hello]]

* メモ

[FIG(quote)[
[FIGCAPTION[
[12] [CITE@en[RFC 5246 - The Transport Layer Security (TLS) Protocol Version 1.2]]
([TIME[2015-02-19 08:58:15 +09:00]] 版)
<http://tools.ietf.org/html/rfc5246#page-80>
]FIGCAPTION]

>
:handshake:An initial negotiation between client and server that
establishes the parameters of their transactions.

]FIG]