2012-05-15 1 views
2

Я пишу приложение, использующее SSLEngine с NIO, я пишу как клиент, так и сервер. Клиент может подключиться к серверу, и после того, как он подключен, я хочу, чтобы он смог выполнить возобновление сеанса/перезаключение, но в настоящее время не повезло.Java JSSE SSLEngine не может возобновить сеанс SSL

Поскольку код, использующий 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?

ответ

5

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

+0

Спасибо очень очень много - вы только что закончили 3 дня бесконечного googeling :) – bennyl

+0

@bennyl Это не документировано, и это не совсем очевидно, но когда вы думаете об этом это должно быть так ... – EJP

+0

я не думаю, что это должно быть так - поскольку SSLEngine отделен от транспортного уровня, я думал, что, используя тот же SSLContext, чтобы создать 2 SSLEngines, они будут использовать один и тот же SSLS-кэш ... – bennyl

0

SSLContext должен быть одноточечным. Вы можете использовать netty 4.0.44.Final SslContextBuilder. Работы возобновляют сессию по сессии.

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

 Смежные вопросы

  • Нет связанных вопросов^_^