代码之家  ›  专栏  ›  技术社区  ›  G B

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

  •  1
  • G B  · 技术社区  · 15 年前

    我需要连接到一个主机,如果它是离线的,我会得到一个TCP超时(它是正常的),如果它是在线的,并且有可用的SSL,我会进入登录阶段。

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

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

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

    谢谢。

    3 回复  |  直到 15 年前
        1
  •  2
  •   Bozho    15 年前
    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
  •  2
  •   David Grant    15 年前

    在SSL中,第一条要发送的消息总是由客户机发送:clienthello。服务器应该用一条serverHello消息来响应,这样当您知道它支持SSL时就可以了。您可以在以下位置关闭连接(通过发送关闭通知警报) 任何 点。 你不需要完成握手 .

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

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

        3
  •  0
  •   PeterMmm    15 年前

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

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