貌似還沒有看到 Android 關(guān)于 SessionTicket,前些天正好用到,這里寫一下。
關(guān)于協(xié)議相關(guān)的,這里就不贅述了,感興趣的可以去看 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、SSLCertificateSocketFactory 可以做成單例,這里只是方便展示,所以直接 new 的對象(當(dāng)然不搞單例也沒什么問題)。
- SSLCertificateSocketFactory.getDefault(5000, sessionCache) 中的 5000 僅為個人經(jīng)驗值,大家可以根據(jù)自己的需要設(shè)置不同值。
其中涉及到的主要是兩個類 SSLSessionCache.java、SSLCertificateSocketFactory.java
關(guān)于 SessionTicket:
我這抓包截了幾張給大家看一下:
這一張是正常的 TLS 握手,可以看到其中 NO.92 中的長度為 3278:

ServerHelloWithCertificate.png
展開后可以看到下圖,其中 Certificate 占了 2795:

CertificateLeangth.png
具體的 SessionTicket 是在第一張圖中的 NO.96 發(fā)送過來的,具體展開可以看到 SessionTicket 的具體內(nèi)容,如圖:

SessionTicket.png
SSLSessionCache 負責(zé)上述 Session 的緩存。當(dāng)已經(jīng)有緩存了以后,再次 Client Hello 會把 SessionTicket 附上,所以圖一中的 Client Hello 長度只有 237,下圖的 ClientHello 為 571,而 Server Hello 只有 191 了:

ServerHello.png
至于 SessionTicket 怎么生成: 阮一峰 - 圖解SSL/TLS協(xié)議