3.1. 概述
客户端通过在 ClientHello 消息中包含 SessionTicket TLS 扩展来表明它支持该机制。如果客户端尚未拥有该服务器的票据, 该扩展将为空。服务器发送一个空的 SessionTicket 扩展, 以表明它将使用 NewSessionTicket 握手消息发送一个新的会话票据。该扩展在 3.2 节中描述。
如果服务器想使用该机制, 它把其会话状态 (例如密码套件 (ciphersuite) 和主密钥 (master secret)) 存入一个票据, 该票据由只有服务器知晓的密钥加密并做完整性保护。该票据使用 3.3 节描述的 NewSessionTicket TLS 握手消息分发给客户端。该消息在 TLS 握手期间、ChangeCipherSpec 消息之前发送, 且在服务器成功验证客户端的 Finished 消息之后。
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
Figure 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
Figure 2: 使用新会话票据的缩写握手消息流
推荐的票据格式见第 4 节。
如果服务器无法或不愿接受该票据, 则它可以与客户端发起一次完整握手。
在服务器此时不希望签发新票据的情况下, 它只是完成握手, 不包含 SessionTicket 扩展或 NewSessionTicket 握手消息。如下所示 (该流程与 RFC 4346 中的 Figure 1 相同, 只是第一条消息中多了 SessionTicket 扩展):
Client Server
ClientHello
(SessionTicket extension) -------->
ServerHello
Certificate*
ServerKeyExchange*
CertificateRequest*
<-------- ServerHelloDone
Certificate*
ClientKeyExchange
CertificateVerify*
[ChangeCipherSpec]
Finished -------->
[ChangeCipherSpec]
<-------- Finished
Application Data <-------> Application Data
Figure 3: 服务器完成完整握手但不签发新会话票据的消息流
也可以使用 RFC 4346 中 Figure 2 定义的缩写握手进行与 Figure 3 类似的交换, 其中客户端使用 SessionTicket 扩展来恢复会话, 但服务器不希望签发新票据, 因此不发送 SessionTicket 扩展。
如果服务器拒绝该票据, 它可能仍希望在执行完整握手之后签发一个新票据, 如下所示 (该流程与 Figure 1 相同, 只是 ClientHello 中的 SessionTicket 扩展非空):
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
Figure 4: 服务器拒绝票据、执行完整握手并签发新会话票据的消息流