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