繁体   English   中英

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

[英]How do I know if a server supports SSL?

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

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

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

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

谢谢。

在SSL中,要发送的第一条消息始终由客户端发送:ClientHello。 服务器应该使用ServerHello消息进行响应,这样当你知道它支持SSL时。 您可以关闭连接(通过发送close_notify警报)在任何点。 您不需要完成握手

如果会话参数不允许建立可信会话,则Iit对于终止中间握手非常常见。

在Java中, SSLEngine类为您提供了对SSL握手所需的控制,但它是一个非常复杂的状态机,需要深入了解SSL。

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM