2

我從http://sanjaal.com/java/tag/get-public-key-of-ssl-certificate-in-java/下面的代碼創建一個套接字並啓動ssl握手。如何縮短ssl握手的等待時間?

SSLSocketFactory factory = HttpsURLConnection 
.getDefaultSSLSocketFactory(); 

System.out.println("Creating a SSL Socket For "+hostname+" on port "+port); 

SSLSocket socket = (SSLSocket) factory.createSocket(hostname, port); 

socket.startHandshake(); 
System.out.println("Handshaking Complete"); 

的問題是,如果握手無法建立,還有很長的等待時間之前,我看到了異常:連接超時

如何設置一個最長等待時間?以及確保我的ssl握手不會成功的合適的最短時間是多少。

+0

無論如何,你應該在一個線程中這樣做,所以你不必等待握手。 SSLSocket提供'addHandshakeCompletedListener'方法。 – Falmarri 2012-07-18 22:29:46

+0

[SSL連接超時和讀超時]的可能重複(http:// stackoverflow。com/questions/7734188/ssl-connection-timeout-and-read-timeouts) – 2012-07-18 22:31:51

+0

socket的setSoTimeout()方法如何? – peshkira 2012-07-18 22:32:49

回答

5

'連接超時'與握手或甚至SSL無關。調用startHandshake()時不會發生這種情況:它在您創建套接字時發生。你的堆棧跟蹤會告訴你。

爲了減少它,使用默認的構造函數創建一個Socket();調用connect(SocketAddress地址,超時);那麼如果成功調用SSLSocketFactory.createSocket(Socket,...)將其包裝在SSLSocket中。

注意你引用的博客的質量確實很差。它的一些問題:

  1. SSL證書不'啓用加密'。它主要用於身份驗證。它在通向會話密鑰的握手中也起着次要的,不重要的作用。例如,TL​​S提供的不僅僅是「防止竊聽,篡改和僞造消息」:它還可以防止重播和中間人攻擊;例如,它提供了更多的加密可能性,而不僅僅是帶有1024或2048字節密鑰的RSA。

  2. 建議'在瀏覽器級別,它只意味着瀏覽器驗證了服務器的證書',並且爲了安全性,用戶/應用程序必須'使用證書中包含的公鑰來加密某些東西,並確保服務器可以理解它是完全廢話。在SSL握手期間,瀏覽器已經通過數字簽名機制檢查到服務器擁有該證書。

  3. 所有這些:「鎖定的掛鎖」圖標與服務器的URL,DNS名稱或IP地址沒有任何關係 - 這是一種常見的誤解。只有在服務器證書本身指定了URL,名稱或地址時,才能安全地建立這種綁定。 '完全不正確。 HTTPS 包括根據證書中嵌入的內容檢查主機名:嵌入證書的內容放在那裏並由簽名機構檢查。

不要依賴像這樣未經審查的未經審查的網站。使用官方產品文檔。

+0

Greate Answer居然!! 1謝謝太多 – 2013-09-12 08:55:50

1

在執行sslSocket.startHandshake();之前,使用sslSocket.setSoTimeout(timeout);

setSoTimeout是一個讀取超時值,因此您在setSoTimeout中提供的超時值也將與握手一起使用。

+0

設置讀取超時。這是連接超時。 – EJP 2017-06-29 19:44:31

+0

@EJP無所謂,對於初始握手,提到的超時選項確實有效。 'socket.startHandshake()'會拋出一個異常(測試jdk8) – benez 2017-08-16 18:52:21