我需要连接到主机,如果它离线我得到TCP超时(并且没关系),如果它在线并且有SSL可用,我将进入登录阶段。
问题是,当服务器在线时,接受配置的TCP端口上的连接,但是然后没有应答SSL握手,我们的应用程序无限期地等待答案。
我正在使用JNI包装的IBM HACL(c ++)来访问服务器。
我如何在服务器端测试(在Windows XP下的Java或C ++中)SSL的可用性?我可以手动启动握手,获取第一个服务器响应,然后关闭TCP套接字吗?或者我需要完成握手(我怎么做?)
感谢。
答案 0 :(得分:2)
在SSL中,要发送的第一条消息始终由客户端发送:ClientHello。服务器应该使用ServerHello消息进行响应,这样当你知道它支持SSL时。您可以在任何点关闭连接(通过发送close_notify警报)。 您无需完成握手。
如果会话参数不允许建立可信会话,则Iit对于终止中间握手很常见。
在Java中,SSLEngine类为您提供了对SSL握手所需的控制,但它是一个非常复杂的状态机,需要深入了解SSL。
答案 1 :(得分:2)
try {
SSLContext ctx = SSLContext.getDefault();
ctx.getClientSessionContext().setSessionTimeout(5); // in seconds
SSLSocket socket = (SSLSocket)
ctx.getSocketFactory().createSocket("host.com", 443);
socket.setSoTimeout(5000); // in millis
socket.startHandshake();
} catch (IOException ex) {
sslAvailable = false;
}
根据您的评论,socket.setSoTimeout(5000)
可以解决问题。
如果这不起作用,那么:
URLConnection urlConn = // obtain connection
urlConn.setConnectTimeout(5000); // in millis
答案 2 :(得分:0)
问题是,当服务器是 在线,接受连接 配置TCP端口,但不是 回答SSL握手,我们的 应用程序无限期地等待 答案。
作为通用解决方案,为什么不将连接代码放入线程并等待线程直到达到超时。