SSL 中的 session 会跟 HTTP 的 session 类似,都是用来保存客户端和服务端之间交互的一些记录。这里的 SSL 的 session 保存的是 SSL 的握手记录。使用 session
无论用哪种方式,客户端都会记录 Session编号,只是 Session Ticket 相比 Session ID,客户端还多该次会话使用的加密信息,会在 SSL 握手过程中由客户端直接发给服务端。所以两者的主要区别,就是加密的握手记录谁负责保存的问题。Session ID 是服务端保存握手记录,Session Ticket 是 客户端保存握手记录。
SSL 握手过程,因为多了几次 RTT,还有加解密的计算,一直以来都是 HTTPS 的耗时大户,是要被优化的重点。复用了握手记录,可以很显著地提高 HTTPS 的效率。
使用 Wireshark 抓包进行分析 Session ID 的使用情况。假设有一次请求,服务端允许使用 Session ID,那么会有下面的流程:
- 客户端的 Client Hello 带上 Session ID
- 服务端复用 Session ID 后,会直接略过协商加密密钥的过程,直接发出一个 Change Cipher Spec 报文
- 然后就是加密的握手信息报文
No. | Time | Source | Destionation | Protocol | Length | Info |
---|---|---|---|---|---|---|
7 | 0.027254 | 172.17.32.63 | 172.17.32.67 | TLSv1.2 | 583 | Client Hello |
8 | 0.036114 | 172.17.32.67 | 172.17.32.63 | TLSv1.2 | 203 | Server Hello, Change Cipher Spec, Encrypted Handshake Message |
9 | 0.041375 | 172.17.32.63 | 172.17.32.67 | TLSv1.2 | 117 | Change Cipher Spec, Hello Request, Hello Request |
解析到的内容有:
Secure Sockets Layer
TLSv1.2 Record Layer: Handshake Protocol: Server Hello
TLSv1.2 Record Layer: Change Cipher Spec Protocol: Change Cipher Spec
Content Type: Change Cipher Spec (20)
Version: TLS 1.2 (0x0303)
Length: 1
Change Cipher Spec Message
[Expert Info (Note/Sequence): This session reuses previously negotiated keys (Session resumption)]
[This session reuses previously negotiated keys (Session resumption)]
[Severity level: Note]
[Group: Sequence]
TLSv1.2 Record Layer: Handshake Protocol: Encrypted Handshake Message
Content Type: Handshake (22)
Version: TLS 1.2 (0x0303)
Length: 40
Handshake Protocol: Encrypted Handshake Message
即 This session reuses previously negotiated keys (Session resumption)
。要复用的握手信息在 Encrypted Handshake Message 中。
在服务端支持 Session ID 的时候会使用该优化,因为这个会消耗服务端资源,所以有的服务端不提供。
因为系统的 openssl 版本的限制,有一些 Android 系统是不支持 Session Ticket 的。如果非要用上这个特性,可以在应用自己携带最新版本的 openssl,代价是包体积会增大很多。
Session Ticket 从 openssl 0.9.8f 开始支持。