2012-09-07 47 views
1

我正在研究Java TLS客戶端和服務器將經常通信。我知道談判TLS連接非常耗費資源和時間。我在GnuTLS中發現了一個非常有趣的解決方案。我感興趣的是可以創建具有恢復能力的Java TLS客戶端 - 使用先前協商的數據建立新連接。在Java中恢復TLS連接

回答

3

只要你使用相同的SSLSocketFactory創建插座,在Java JSSE實現會自動恢復現有會話,會話是否仍然有效。

您可以通過調用SSLSocket.getSession().getId()來驗證這一點,並檢查兩個不同套接字是否使用同一個會話。

+0

只要你實際使用相同的'SSLContext'。 – EJP

1

實際上,它是您必須保留的sslcontext,因爲它是包含ssl會話緩存的sslcontext。 SSLContext也有一個 SSLSessionContext getClientSessionContext()。這個SSLSessionContext允許你調整多少個ssl會話保持多久。

不幸的是,第三方訪問SSLContext設置的情況非常少見他們認爲他們幫你包裝它,或者他們什麼都不要求你提供SSLServerSocketFactory類名(甚至沒有預先調整過的實例一)。

在客戶端套接字的情況下,它是困難的。我通常必須準備一個線程本地套接字工廠,預計一個套接字將被打開幾十個更深的棧幀。

訣竅是提供一個輕量級的socketfactory(客戶端或服務器)的類名,它除了查找包含您初始化所需方式的真實工廠的threadlocal外(無論是作爲服務器還是客戶端的ssl會話緩存)。