3.3. NewSessionTicket ハンドシェイクメッセージ
このメッセージは、TLS ハンドシェイク中に ChangeCipherSpec メッセージより前にサーバーによって送信されます。このメッセージは、サーバーが ServerHello に SessionTicket 拡張を含めた場合に送信しなければなりません (MUST)。このメッセージは、サーバーが ServerHello に SessionTicket 拡張を含めなかった場合には送信してはなりません (MUST NOT)。このメッセージは、Finished メッセージを作成および検証するために使用されるハッシュに含まれます。完全ハンドシェイクの場合、サーバーはチケットを送信する前にクライアントの Finished メッセージを検証しなければなりません (MUST)。クライアントは、サーバーの Finished メッセージを検証するまで、チケットを有効なものとして扱ってはなりません (MUST NOT)。サーバーが ServerHello に SessionTicket 拡張を含めた後にチケットを含めたくないと判断した場合、サーバーは NewSessionTicket ハンドシェイクメッセージで長さゼロのチケットを送信します。
サーバーがクライアントのチケットの検証に成功した場合、サーバーは簡略ハンドシェイクにおいて ServerHello の後に NewSessionTicket ハンドシェイクメッセージを含めることによってチケットを更新してもよいです (MAY)。クライアントは、サーバーの Finished メッセージを検証した後、できるだけ早く新しいチケットを新しい接続に使用し始めるべきです。更新されたチケットはハンドシェイクが完了する前に発行されるため、クライアントが新しい接続を開始する前に新しいチケットを使用しない可能性があることに注意してください。サーバーは、クライアントの Finished メッセージの検証に成功するまで、クライアントが実際に更新されたチケットを受け取ったと仮定してはなりません (MUST NOT)。
NewSessionTicket ハンドシェイクメッセージには番号 4 が割り当てられており、その定義を本節の最後に示します。ticket_lifetime_hint フィールドには、チケットをどのくらいの期間保存すべきかについてのサーバーからのヒントが含まれます。この値は、チケットを受け取った時点を基準とした、ネットワークバイトオーダーの 32 ビット符号なし整数としての秒単位の有効期間を示します。値 0 は、チケットの有効期間が指定されていないことを示すために予約されています。クライアントは、時間が経過したらチケットと関連する状態を削除すべきです (SHOULD)。クライアントは、ローカルポリシーに基づいてより早くチケットを削除してもよいです (MAY)。サーバーは、チケットを ticket_lifetime_hint に記載されている期間より短いまたは長い期間有効なものとして扱ってもよいです (MAY)。
struct {
HandshakeType msg_type;
uint24 length;
select (HandshakeType) {
case hello_request: HelloRequest;
case client_hello: ClientHello;
case server_hello: ServerHello;
case certificate: Certificate;
case server_key_exchange: ServerKeyExchange;
case certificate_request: CertificateRequest;
case server_hello_done: ServerHelloDone;
case certificate_verify: CertificateVerify;
case client_key_exchange: ClientKeyExchange;
case finished: Finished;
case session_ticket: NewSessionTicket; /* NEW */
} body;
} Handshake;
struct {
uint32 ticket_lifetime_hint;
opaque ticket<0..2^16-1>;
} NewSessionTicket;