我正在编写一个使用 SSLEngine 和 NIO 的应用程序,我同时编写客户端和服务器。客户端能够连接到服务器,在他连接后,我希望他能够执行会话恢复/重新协商,但目前没有运气。
由于使用SSLEngine的代码非常大(SSLEngine的使用非常复杂!),我将编写一个简单的伪代码来演示这种情况:
Server:
global sslcontext initialized once
await new client
client.sslEngine = create new server ssl engine using the global sslcontext
client.handleHandshake and wait for it to be done
handle client.
Client:
global sslcontext initialized once
sslEngine = create new client ssl engine using the global sslcontext
performHandshake and wait for it to be done
disconnect (close gracefully the connection)
sslEngine = create new client ssl engine using the global sslcontext
configure engine to not allow session creation
performHandshake and wait for it to be done
** 我更愿意发布任何可以提供帮助的代码部分(甚至是完整的代码,尽管正如我所说,它很大......
当我执行程序时,第一个连接成功,但第二个连接导致异常:
javax.net.ssl.SSLHandshakeException: No existing session to resume
我是否错过了恢复 SSL 会话所需的某些成分?
SSLEngine只有在使用SSLContext.createEngine(host,port)创建时才会恢复会话。否则,它无法知道它在与谁交谈,因此无法知道SSLSession
加入什么。
SSLContext 应该是单例。您可以使用netty 4.0.44.Final SslContextBuilder。按会话 ID 恢复工作。
private SslContext sslContext;
...
if (serverSSLContext == null) {
serverSSLContext = SslContextBuilder.forServer(new File("cert.crt"), new File("cert.key")).build();
}
channelPipeLine.addLast(serverSSLContext.newHandler(channelPipeLine.channel().alloc()));