我需要使用TLS上的TCP套接字来处理我正在开发的应用程序。我已经看过几十个例子,虽然我没有问题通过握手,但我似乎无法通过任何方式读取输入流(尝试了很多,包括readline()、读到字符数组等)。每次我试一试,应用程序就会冻结在那个地方。如果我调试,它永远不会进入下一行代码。
在一个尝试的解决方案中,我决定转而使用SSLEngine,因为这应该是Java1.5对java.nio的解决方案。然而,我发现了一个例子(在这里:http://docs.oracle.com/javase/7/docs/technotes/guides/security/jsse/samples/sslengine/SSLEngineSimpleDemo.java),它对我来说有点令人困惑,而且我还没有成功地实现它。当我尝试时,解包()调用会产生一个空缓冲区,在这里我知道(通过在命令行上使用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());发布于 2013-06-25 17:51:37
我写了一些东西,使使用SSLEngine更容易。它可以与NIO一起使用,也可以用于其他用例。可在这里获得SSLFacade
发布于 2012-04-02 03:56:14
如果打开的是SSL握手消息或警报,而不是应用程序数据,则unwrap()可以生成空缓冲区。这里没有足够的信息可以说更多。后来引擎状况如何?
发布于 2012-07-20 12:48:12
beginHandshake不进行握手,它只用于通知SSLEngine您想要为下一个要包装/解除包装的调用执行握手。它是有用的,当你想做另一次握手。对于最初的一个,它是不需要的,因为包装的第一个调用将启动握手。
此外,您还必须检查包装和解包装方法的结果,以确定是否所有数据都已正确编码。可能发生的情况是,您必须多次调用这些方法来处理所有数据。
以下链接可能会有所帮助:http://onjava.com/onjava/2004/11/03/ssl-nio.html
https://stackoverflow.com/questions/9949806
复制相似问题