2010-02-16 77 views
1

我需要连接到一台主机,如果它离线,我得到一个TCP超时(并且没问题),如果它使用SSL提供在线,我就进入登录阶段。如何知道服务器是否支持SSL?

问题是,当服务器联机时,在配置的TCP端口上接受连接,但不会回答SSL握手,我们的应用程序会无限期地等待答案。

我使用由JNI包装的IBM HACL(C++)来访问服务器。

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

谢谢。

+0

嗯,实际上,如何提供一些代码在那里..因为在正常的环境下连接立即下降。 – Bozho

+0

创建一个服务器套接字,并让它在没有发送任何内容的情况下监听端口,然后尝试连接到该端口并启动SSL握手。 我用netcat试了一下。 –

+0

ECLConnList ConnList; ECLConnection * Conn = ConnList.GetFirstConnection(); Conn-> StartCommunication(); –

回答

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 
+0

嗯,工作,但它似乎与我试图做的完全相反: - 如果主机根本没有回答,startHandshake()会一直等待。我可以将它封装在线程中,并在给定的超时后关闭套接字。 - 如果主机支持SSL,我得到一个javax.net.ssl.SSLHandshakeException:握手期间远程主机关闭连接 它可以工作,但我不知道它是否是正确的解决方案。 –

+0

@G B看到我关于超时的更新。 – Bozho

+0

同样的问题。会话超时是不同的。 –

2

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

如果会话参数不允许建立可信会话,那么对端终止中握手是非常普遍的。

在Java中,SSLEngine类为您提供了希望通过SSL握手进行控制的类型,但它是相当复杂的状态机,需要深入了解SSL。

+0

很高兴知道有一个解决方案,至少在理论上。 我只需要找出如何在Java中实现它。 –

+0

创建一个SSLSocket并调用startHandshake()或发送一些数据。如果你没有做这些事情,那么握手不会开始。设置套接字超时以及确保。 – EJP

+1

@EJP:很高兴在这里见到你。我喜欢你的网络书。:) –

0

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

作为一般用途的解决方案,为什么不把连接代码放入一个线程并等待线程,直到超时。

+0

是的,我们做了:连接挂起并且无法关闭。 问题是IBM Host Access Library。 –

+0

作为一个通用的解决方案,为什么不使用读取超时? – EJP

相关问题