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()));