2012-05-03 91 views

回答

2

有3個條件,開始在一個SSLSocket握手:

  • 調用startHandshake其中明確開始握手,或
  • 任何嘗試讀取或寫入應用數據在此插座會導致一個隱含的握手,或
  • 如果沒有當前有效的會話並且隱式握手完成,則調用getSession將嘗試設置會話。

任意握手故障將產生一個異常(包括當證書不被信任):

如果握手由於某種原因失敗,則SSLSocket已被關閉,沒有 futher通信可做完了。

通常情況下,調用startHandshake()明確地建立連接時是不必要的,因爲當你開始從InputStream讀取(或寫入的OutputStream)握手開始。如果發生任何故障,將導致異常並停止正常的控制流程。在這些情況下,您無需顯式註冊捕獲完成握手:如果您可以從流中讀取/寫入,則完成。

如果您是要求重新協商的服務器(通過在交換了一些應用程序數據後調用startHandshake()),那麼握手完成通知非常有用。在這種情況下,您可能希望在繼續之前等待握手完成。例如,如果服務器在收到特定路徑的HTTP請求後請求客戶端證書,則可能希望在發送響應之前等待握手成功完成以授權客戶端證書。這是因爲startHandshake()不會停止的應用程序數據流:

如果數據已經在連接上發送,它延續了這一握手期間流動 。

+0

似乎服務器必須緩存客戶端發送的數據,直到握手完成。這似乎會導致問題,因爲默認的Apache Web服務器緩存大約是128K,並且HTTP PUT文件可能很大...... – Ryan

+0

@Ryan否。服務器不會*獲取客戶端發送的數據數據,直到握手完成。在握手完成之前,沒有可以發送數據的連接。 – EJP

+0

@EJP編號SSL重新協商與數據傳輸同時發生。請參閱http://stackoverflow.com/questions/14281628/ssl-renegotiation-with-client-certificate-causes-server-buffer-overflow和http://httpd.apache.org/docs/2.2/mod/mod_ssl。html#sslrenegbuffersize和http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.20和... – Ryan