Java JSSE SSLEngine не может возобновить сеанс SSL

Я пишу приложение, которое использует 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?

2 ответа

Решение

SSLEngine будет возобновлять сеансы только в том случае, если вы создадите его с помощью SSLContext.createEngine(хост, порт). В противном случае у него нет возможности узнать, с кем он говорит, поэтому нет возможности узнать, что SSLSession присоединиться.

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()));
Другие вопросы по тегам