3

我正在编写一个使用 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 会话所需的一些成分?

4

2 回答 2

6

仅当您使用SSLContext.createEngine(host, port)创建 SSLEngine 时,它​​才会恢复会话。否则它无法知道它正在与谁交谈,因此无法知道SSLSession加入什么。

于 2012-05-15T23:26:29.930 回答
0

SSLContext 应该是单例的。您可以使用netty 4.0.44.Final SslContextBuilder。通过 sessionId 恢复会话。

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()));
于 2017-02-20T16:06:52.273 回答