Android 启用 SessionTicket

貌似还没有看到 Android 关于 SessionTicket,前些天正好用到,这里写一下。 关于协议相关的,这里就不赘述了,感兴趣的可以去看 RFC

这里先把具体代码列一下,然后我们在细说。

SSLSessionCache sessionCache = new SSLSessionCache(getApplicationContext());
SSLCertificateSocketFactory socketFactory = (SSLCertificateSocketFactory)SSLCertificateSocketFactory.getDefault(5000, sessionCache);
Socket socket = socketFactory.createSocket();
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
 socketFactory.setUseSessionTickets(socket, true);
}

需要注意的地方:

其中涉及到的主要是两个类 SSLSessionCache.javaSSLCertificateSocketFactory.java

关于 SessionTicket:

我这抓包截了几张给大家看一下:

这一张是正常的 TLS 握手,可以看到其中 NO.92 中的长度为 3278: ServerHelloWithCertificate.png

展开后可以看到下图,其中 Certificate 占了 2795: CertificateLeangth.png

具体的 SessionTicket 是在第一张图中的 NO.96 发送过来的,具体展开可以看到 SessionTicket 的具体内容,如图: SessionTicket.png

SSLSessionCache 负责上述 Session 的缓存。当已经有缓存了以后,再次 Client Hello 会把 SessionTicket 附上,所以图一中的 Client Hello 长度只有 237,下图的 ClientHello 为 571,而 Server Hello 只有 191 了: ServerHello.png

至于 SessionTicket 怎么生成: 阮一峰 - 图解SSL/TLS协议