2012-03-30 5 views
6

Мне нужно работать с TCP-сокетом через TLS для приложения, над которым я работаю. Я прошел через десятки примеров, и, хотя у меня нет проблем с получением рукопожатия, я не могу читать поток ввода любыми способами (много пробовал, включая readline(), чтение в массив символов и т. Д.). каждый раз, когда я пытаюсь, приложение зависает на этом месте. Если я отлаживаю, он никогда не переходит к следующей строке кода.Android SSLEngine example

В попытке решить, я решил перейти к использованию SSLEngine, так как это должен быть ответ Java 1.5 для java.nio для SSL. Тем не менее, я нашел один пример (здесь: http://docs.oracle.com/javase/7/docs/technotes/guides/security/jsse/samples/sslengine/SSLEngineSimpleDemo.java), что более чем немного смущает меня, и я не преуспел в его реализации. Когда я пытаюсь, вызов unwrap() дает пустой буфер, где я знаю (используя OpenSSL в командной строке), что рассматриваемая служба перетаскивает данные обратно вниз по каналу.

Предложения приветствуются, я сжег слишком много времени на этом уже. Вот соответствующий код:

SSLEngine engine = sslContext.createSSLEngine(uri.getHost(), uri.getPort()); 
      engine.setUseClientMode(true); 
      engine.beginHandshake(); 
      SSLSession session = engine.getSession(); 
      int bufferMax = session.getPacketBufferSize(); 
      int appBufferMax = session.getApplicationBufferSize() + 50; 
      ByteBuffer cTo = ByteBuffer.allocateDirect(bufferMax); 
      ByteBuffer sTo = ByteBuffer.allocateDirect(bufferMax); 

      ByteBuffer out = ByteBuffer.wrap(sessionId.getBytes()); 
      ByteBuffer in = ByteBuffer.allocate(appBufferMax); 


      debug("sending secret"); 
      SSLEngineResult rslt = engine.wrap(out, cTo); 
      debug("first result: " + rslt.toString()); 
      sTo.flip(); 
      rslt = engine.unwrap(sTo, in); 
      debug("next result" + rslt.toString()); 
+0

Как обновление, я также попытался выполнить цикл при вызове разворота, пока (rslt.getStatus()! = SSLEngineResult.Status.OK), и он никогда не был заполнен, и статус не стал OK. – Paul

+0

Вы пытались запустить этот код в обычном Java-приложении? Это, по крайней мере, поможет определить, является ли его проблема специфичной для Android или нет. – elevine

+0

Да, я не думаю, что это специфично для Android, я просто делаю это в проекте Android. – Paul

ответ

1

Эта реализация не хватает некоторых ключевых элементов. А именно, рукопожатие может отскакивать между несколькими состояниями NEED_WRAP, NEED_UNWRAP, NEED_TASK для согласования соединения. Это означает, что вы не можете просто позвонить один, а затем другой. Вам нужно будет перебрать состояния, пока не будет выполнено рукопожатие.

while (handshaking) { 
     switch (state) { 
      case NEED_WRAP: 
       doWrap(); 
       break; 
      case NEED_UNWRAP: 
       doUnwrap(); 
       break; 
      case NEED_TASK: 
       doTask(); 
       break; 
     } 
    } 

A full working example of Java SSL and NIO

Теперь, когда сказал, вы должны знать, SSLEngine на Android is broken. Google рекомендует использовать потоки и блокировать сокеты в соответствии с этим потоком.

0

unwrap() может дать пустой буфер, если что разворачивал было рукопожатия сообщение SSL или предупреждение, а не данные приложения. Здесь недостаточно информации, чтобы сказать больше. Каков был статус двигателя после этого?

0

beginHandshake не выполняет рукопожатие, он просто используется для информирования SSLEngine о том, что вы хотите выполнить рукопожатие для следующих вызовов для обертывания/разворота. Это полезно, когда вы хотите выполнить другое рукопожатие. Для первоначального, это не нужно, так как первый вызов для обертывания инициирует рукопожатие.

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

Следующая ссылка может помочь: http://onjava.com/onjava/2004/11/03/ssl-nio.html

Или этот вопрос: SSL Handshaking Using Self-Signed Certs and SSLEngine (JSSE)

0

Я написал что-то, чтобы упростить использование SSLEngine. Он может использоваться с NIO или для других случаев использования. Available here SSLFacade

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

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