2010-02-16 99 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

相關問題