我需要在我正在开发的应用程序中使用TCP套接字上的TLS。我已经浏览了数十个示例,虽然我没有问题通过握手,但我似乎无法通过任何方式读取输入流(尝试了很多,包括readline()、读取到字符数组等)。每次我尝试时,应用程序都会在那个位置冻结。如果我调试,它永远不会进入下一行代码。
在尝试解决问题时,我决定转向使用SSLEngine,因为这是Java 1.5对于SSL的java.nio的答案。然而,我只找到了一个示例(在这里:http://docs.oracle.com/javase/7/docs/technotes/guides/security/jsse/samples/sslengine/SSLEngineSimpleDemo.java),对我来说有点混乱,我没有成功实现它。当我尝试时,unwrap()调用产生了一个空缓冲区,而我知道(从在命令行上使用OpenSSL)所涉及的服务将数据推回管道。
欢迎提出建议,我已经花费了太多时间在这上面了。以下是相关代码:
在尝试解决问题时,我决定转向使用SSLEngine,因为这是Java 1.5对于SSL的java.nio的答案。然而,我只找到了一个示例(在这里: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());