[英]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.