メインコンテンツまでスキップ

3.1. 概要

クライアントは、ClientHello メッセージに SessionTicket TLS 拡張を含めることによって、この機構をサポートすることを示します。クライアントがサーバー用のチケットをまだ所持していない場合、拡張は空になります。サーバーは、NewSessionTicket ハンドシェイクメッセージを使用して新しいセッションチケットを送信することを示すために、空の SessionTicket 拡張を送信します。この拡張については 3.2 節で説明します。

サーバーがこの機構を使用したい場合、サーバーは自身のセッション状態 (暗号スイートやマスターシークレットなど) を、サーバーだけが知っている鍵によって暗号化され完全性保護されたチケットに格納します。チケットは、3.3 節で説明されている NewSessionTicket TLS ハンドシェイクメッセージを使用してクライアントに配布されます。このメッセージは、サーバーがクライアントの Finished メッセージの検証に成功した後、ChangeCipherSpec メッセージより前に、TLS ハンドシェイク中に送信されます。

  Client                                               Server
      ClientHello
(empty SessionTicket extension)-------->
ServerHello
(empty SessionTicket extension)
Certificate*
ServerKeyExchange*
CertificateRequest*
<-------- ServerHelloDone
Certificate*
ClientKeyExchange
CertificateVerify*
[ChangeCipherSpec]
Finished -------->
NewSessionTicket
[ChangeCipherSpec]
<-------- Finished
Application Data <-------> Application Data

図 1: 新しいセッションチケットを発行する完全ハンドシェイクのメッセージフロー

クライアントは、このチケットを、現在のセッションに関連付けられたマスターシークレットおよびその他のパラメータとともにキャッシュします。クライアントがセッションを再開したいとき、ClientHello メッセージ内の SessionTicket 拡張にチケットを含めます。付録 A では、拡張のエンコーディングと RFC 4507 からの変更点について詳細に説明します。サーバーは、受け取ったチケットを復号し、チケットの有効性を検証し、チケットの内容からセッション状態を取り出し、この状態を使用してセッションを再開します。TLS セッション ID との相互作用については 3.4 節で説明します。サーバーがクライアントのチケットの検証に成功した場合、サーバーは ServerHello の後に NewSessionTicket ハンドシェイクメッセージを含めることによってチケットを更新してもよいです。

      Client                                                Server
ClientHello
(SessionTicket extension) -------->
ServerHello
(empty SessionTicket extension)
NewSessionTicket
[ChangeCipherSpec]
<-------- Finished
[ChangeCipherSpec]
Finished -------->
Application Data <-------> Application Data

図 2: 新しいセッションチケットを使用する簡略ハンドシェイクのメッセージフロー

推奨されるチケット形式は 4 節に示します。

サーバーがチケットを尊重できない、または尊重したくない場合、サーバーはクライアントとの完全ハンドシェイクを開始できます。

サーバーがこの時点で新しいチケットを発行したくない場合、サーバーは SessionTicket 拡張や NewSessionTicket ハンドシェイクメッセージを含めずにハンドシェイクを完了するだけです。これを以下に示します (このフローは、最初のメッセージの SessionTicket 拡張を除いて、RFC 4346 の Figure 1 と同一です)。

  Client                                               Server
      ClientHello
(SessionTicket extension) -------->
ServerHello
Certificate*
ServerKeyExchange*
CertificateRequest*
<-------- ServerHelloDone
Certificate*
ClientKeyExchange
CertificateVerify*
[ChangeCipherSpec]
Finished -------->
[ChangeCipherSpec]
<-------- Finished
Application Data <-------> Application Data

図 3: 新しいセッションチケットを発行せずに完全ハンドシェイクを完了するサーバーのメッセージフロー

また、RFC 4346 の Figure 2 で定義された簡略ハンドシェイクを使用して、図 3 と同様の交換を行うことも許されます。この場合、クライアントは SessionTicket 拡張を使用してセッションを再開しますが、サーバーは新しいチケットを発行したくないため、SessionTicket 拡張を送信しません。

サーバーがチケットを拒否した場合でも、以下に示すように完全ハンドシェイクを実行した後に新しいチケットを発行したい場合があります (このフローは、ClientHello の SessionTicket 拡張が空でないことを除いて、図 1 と同一です)。

  Client                                               Server
      ClientHello
(SessionTicket extension) -------->
ServerHello
(empty SessionTicket extension)
Certificate*
ServerKeyExchange*
CertificateRequest*
<-------- ServerHelloDone
Certificate*
ClientKeyExchange
CertificateVerify*
[ChangeCipherSpec]
Finished -------->
NewSessionTicket
[ChangeCipherSpec]
<-------- Finished
Application Data <-------> Application Data

図 4: チケットを拒否し、完全ハンドシェイクを実行し、新しいセッションチケットを発行するサーバーのメッセージフロー