2015-06-30 43 views
0

Q1:是什麼狀態NOT_HANDSHAKING和枚舉的SSLEngine上的SSLEngineResult.HandshakeStatus FINISHED之間的區別?差異和成品

的Javadoc只是說

FINISHED:SSLEngine只是剛剛結束握手。

NOT_HANDSHAKING:SSLEngine當前沒有握手。

我特別想知道:

Q2:如果初始握手已經成功地進行,如果發動機處於狀態成品或狀態NOT_HANDSHAKING?

是什麼讓我懷疑的是:示例代碼SSLChannel.java到this article,告訴

case NOT_HANDSHAKING: 
    assert false : "doHandshake() should never reach the NOT_HANDSHAKING state"; 

,而在我的示例程序的初始握手似乎與國家NOT_HANDSHAKING完成。所以我不知道這是好還是錯誤的狀態。另外,官方JSSE Refernce Guide是沒有幫助的,因爲它只是說

// Handle other status: // FINISHED or NOT_HANDSHAKING 
    ... 

任何信息表示讚賞。

+1

每個換行/解包可能會改變握手狀態。你應該先看到一個完成;之後,你應該看到NOT_HANDSHAKING - 直到同伴試圖重新談判。 – ZhongYu

+1

我已經做了一些ssl [編碼](https://github.com/zhong-j-yu/bayou/blob/0.9/src/bayou/ssl/SslHandshaker.java#L200)以防萬一您可以參考。 – ZhongYu

+0

太好了。謝謝。我很好奇看到握手狀態將如何與我的程序進行比較。 – user120513

回答

3
  • FINISHED意味着你必須只是結束,它只是永遠存在於由wrap()/unwrap()返回握手狀態對象。

  • NOT_HANDSHAKING表示沒有進行握手,並且由上述狀態對象和由getHandshakeStatus()返回的狀態對象返回。

+0

謝謝@EJP,您的回答對於識別bayou.io代碼和我的關鍵區別非常有幫助。你碰巧知道爲什麼SSLEngine API使用兩個握手狀態,即engine.getHandshakeStatus()和result.getHandshakeStatus()? – user120513

+0

正是這樣才能實現這種差異。我沒有看到自己需要完成任務,但是我看不到SSSLEngine有太多需求。他們可以提供一個SSLSocketChannel。對於大多數實現者來說這很困難,但是可能的,JDK就是它應該提供的地方。 – EJP

+0

其實我喜歡SSLEngine的想法,從傳輸機制中分離出SSL/TLS邏輯。但從用戶的角度來看,只有一個hs狀態會更簡單:一個簡單的'switch(engine.getHandshakeStatus()){...}'就可以做到。但是現在它已經設計好了,如果必須評估engine.getHandshakeStatus或result.getHandshakeStatus,我們總是需要關心它。無論如何,這個API就是這樣。 – user120513