2013-09-18 2 views
0

Я пытаюсь получить клиент/серверную программу обмена http-сообщениями по ssl. Для начала я создал клиентские и серверные программы, которые успешно обмениваются http-запросами, используя DefaultHttpRequest. Код, который посылает запрос выглядит примерно так:Netty - отправка http-запросов по ssl

HttpRequest request = new DefaultHttpRequest(HttpVersion.HTTP_1_1, HttpMethod.POST, "https://localhost:8443"); 

    ChannelBuffer buf = ChannelBuffers.copiedBuffer(line, "UTF-8"); 
    request.setContent(buf); 

    request.setHeader(HttpHeaders.Names.HOST, host); 
    request.setHeader(HttpHeaders.Names.CONNECTION, HttpHeaders.Values.CLOSE); 
    request.setHeader(HttpHeaders.Names.CONTENT_TYPE, "text/xml"); 
    request.setHeader(HttpHeaders.Names.CONTENT_LENGTH, Integer.toString(buf.capacity())); 

    ChannelFuture writeFuture = channel.write(request); 

клиент трубопровода завод содержит следующее:

pipeline.addLast("decoder", new HttpResponseDecoder()); 
pipeline.addLast("encoder", new HttpRequestEncoder()); 

// and then business logic. 
... 

Сервер трубопровода завод содержит следующее:

pipeline.addLast("decoder", new HttpRequestDecoder()); 
pipeline.addLast("encoder", new HttpResponseEncoder()); 

// and then business logic. 

....

Пока все хорошо. Клиент отправляет, сервер принимает и декодирует запрос. Метод messageReceived на моем обработчике вызывается с правильными данными.

Для того, чтобы включить SSL, я взял код из SecureChat примера и добавляют к стороне клиента, так и сервера трубопроводов заводов:

Для сервера:

SSLEngine engine = SecureChatSslContextFactory.getServerContext().createSSLEngine(); 
engine.setUseClientMode(false); 

pipeline.addLast("ssl", new SslHandler(engine)); 

// On top of the SSL handler, add the text line codec. 
pipeline.addLast("framer", new DelimiterBasedFrameDecoder(
     8192, Delimiters.lineDelimiter())); 

Для клиента:

SSLEngine engine = SecureChatSslContextFactory.getClientContext().createSSLEngine(); 
engine.setUseClientMode(true); 

pipeline.addLast("ssl", new SslHandler(engine)); 

// On top of the SSL handler, add the text line codec. 
pipeline.addLast("framer", new DelimiterBasedFrameDecoder(
     8192, Delimiters.lineDelimiter())); 

Теперь, когда я отправляю запрос от клиента, на сервере ничего не происходит. Когда я запускаю приложения, кажется, что сервер подключается (channelConnected вызывается), но когда я отправляю сообщение, ни один из данных не попадает на сервер (messageReceived никогда не вызывается).

Есть ли что-то явно неправильное в отношении того, что я делаю? Так работает https? Или существует другой способ отправки HTTP-запросов через ssl?

Спасибо, Weezn

ответ

0

Вы должны вызвать SslHandler.handshake() на стороне клиента. Проверьте пример снова там.

0

Упс, похоже, я скопировал и вставил слишком много с примера SecureChat.

Удаление исправления с разделителемFrameDecoder, похоже, устраняет проблему.

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