在Java中恢复TLS连接

我正在研究Java TLS客户端和服务器女巫将经常进行通信。 我知道协商TLS连接非常耗费资源和时间。 我在GnuTLS中找到了一个非常有趣的解决方案。 我感兴趣的是可以创建具有恢复function的Java TLS客户端 – 使用先前协商的数据建立新连接。

最好的祝愿

只要您使用相同的SSLSocketFactory来创建套接字,如果会话仍然有效,Java中的JSSE实现将自动恢复现有会话。

您可以通过调用SSLSocket.getSession().getId()来validation这一点,并检查两个不同的套接字是否使用相同的会话。

实际上,您必须保留sslcontext,因为它是包含ssl会话缓存的sslcontext。 SSLContext还有一个SSLSessionContext getClientSessionContext()。 此SSLSessionContext允许您调整要保留的ssl会话数和持续时间。

不幸的是,在第三方中访问SSLContext设置是非常罕见的。它们包装它以供您认为它们可以帮助您,或者它们不会要求您提供SSLServerSocketFactory类名(甚至不是预先调优的实例)。

在客户端套接字的情况下,它很难。 我通常必须准备一个threadlocal套接字工厂,预计套接字将被打开几十个堆栈框架。

诀窍是提供轻量级socketfactory(客户端或服务器)的类名,除了查找包含您按照所需方式初始化的真实工厂的threadlocal(除了作为服务器或客户端的ssl会话的缓存)之外什么都不做。