我如何知道服务器是否支持SSL?

时间:2010-02-16 15:32:45

标签: java ssl tcp

我需要连接到主机,如果它离线我得到TCP超时(并且没关系),如果它在线并且有SSL可用,我将进入登录阶段。

问题是,当服务器在线时,接受配置的TCP端口上的连接,但是然后没有应答SSL握手,我们的应用程序无限期地等待答案。

我正在使用JNI包装的IBM HACL(c ++)来访问服务器。

我如何在服务器端测试(在Windows XP下的Java或C ++中)SSL的可用性?我可以手动启动握手,获取第一个服务器响应,然后关闭TCP套接字吗?或者我需要完成握手(我怎么做?)

感谢。

3 个答案:

答案 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握手,我们的   应用程序无限期地等待   答案。

作为通用解决方案,为什么不将连接代码放入线程并等待线程直到达到超时。