簡體   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