Android SSLEngine 示例

标签 android sslengine

我需要为我正在开发的应用程序使用基于 TLS 的 TCP 套接字。我已经经历了几十个例子,虽然我通过握手没有问题,但我似乎无法通过任何方式读取输入流(尝试了很多,包括 readline(),读取字符数组等)。每次我尝试时,应用程序都会在那个地方卡住。如果我调试,它永远不会转到下一行代码。

在尝试的解决方案中,我决定转而使用 SSLEngine,因为这应该是 Java 1.5 对 java.nio for 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());

最佳答案

此实现缺少一些关键部分。即握手可以在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

话虽如此,您应该了解 Android is broken 上的 SSLEngine . Google 建议根据该线程使用线程和阻塞套接字。

关于Android SSLEngine 示例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9949806/

相关文章:

android - 如何在 Android 中拥有这种类型的时间选择器?

android - 让服务接收 SMS 消息

java - 动态添加时 Android 自定义 View 不起作用

java - SSLEngine 并关闭

java - 再次调用共享 SSLContext 对象的 init() 时对 SSLEngine 的影响

java - 将 DialogFragment 中的属性设置到 MainActivity 中

java - Android 音频卡在底部扬声器上,无法在我的应用程序中使用耳机。应用程序也卡住

java - SSLEngine 关闭

java - TLS 将 SSLEngine 下载中间证书

android - 让 SSLEngine 在 Android (4.4.2) 上使用 TLSv1.2?