2011-01-28 62 views
10

我有一個嵌入Jetty的應用程序。我希望在SSL中使用客戶端證書身份驗證,並在啓用時進行驗證;我在請求開始時收到以下異常。但是這個請求在那之後得到了正確的處理。只有從IE或Chrome訪問時纔會出現此異常。它從Firefox訪問時不會來。我們有我們的定製SSLConnector擴展SslSocketConnector。我正在嘗試調試它;但想知道是否有任何特定的地方/代碼可以開始檢查。請求開始時出現異常 - ClientAuth SSL

javax.net.ssl.SSLHandshakeException: Remote host closed connection during handshake 
     at com.sun.net.ssl.internal.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:808) 
     at com.sun.net.ssl.internal.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1112) 
     at com.sun.net.ssl.internal.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1139) 
     at com.sun.net.ssl.internal.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1123) 
     at org.mortbay.jetty.security.SslSocketConnector$SslConnection.run(SslSocketConnector.java:631) 
     at org.mortbay.thread.BoundedThreadPool$PoolThread.run(BoundedThreadPool.java:451) 
Caused by: java.io.EOFException: SSL peer shut down incorrectly 
     at com.sun.net.ssl.internal.ssl.InputRecord.read(InputRecord.java:333) 
     at com.sun.net.ssl.internal.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:789) 

更新:

我啓用SSL調試選項,並獲得在該異常的ServerHelloDone消息後立即讀取。這是服務器發送證書的消息,以及我相信客戶端證書的請求。我不確定最初閱讀中發生了什麼。任何幫助深表謝意。

*** ClientHello, TLSv1 
**** 
%% Created: [Session-1, TLS_RSA_WITH_AES_128_CBC_SHA] 
*** ServerHello, TLSv1 
*** Certificate chain 
*** 
*** CertificateRequest 
Cert Types: RSA, DSS 
Cert Authorities: 
*** ServerHelloDone 
WRITE: TLSv1 Handshake, length = 703 
received EOFException: error 
handling exception: javax.net.ssl.SSLHandshakeException: Remote host closed connection during handshake 

更新: 更新JDK到最新的,23並試圖啓用/禁用這兩個特性。仍然得到相同的行爲。

更多信息: TLSv1和SSLv3已在所有瀏覽器中啓用。沒有啓用client-auth,通信正常發生。通過客戶端身份驗證,我們總是會在第一次握手時得到例外,而下一次正確地完成並繼續進行,沒有例外。在服務器端使用碼6.1.14版

+0

正如@Dan所說,您需要將`javax.net.debug`系統屬性設置爲`all`或`debug`。對於大多數Java發射器,只需將-Djavax.net.debug = all`添加到參數中即可。 – 2011-01-29 23:24:54

回答

8

我已經看到類似TLS/SSLv3協商這樣的問題。 http://www.oracle.com/technetwork/java/javase/documentation/tlsreadme2-176330.html

在SSL/TLS中,任何一方都可以啓動重新協商。像第1階段修復程序,應用程序在可互操作模式下的未升級等和該嘗試(經由SSLSocket.startHandshake()SSLEngine.beginHandshake())以發起重新協商將收到一個SSLHandshakeExceptionIOException)進行通信,並且連接將被關閉(handshake_failure)。

  • 的TLSv1:接收從一個未升級的對等點重新協商請求的應用程序將根據連接到位類型響應類型「no_renegotiation(100)」將被髮送到對等的警告Alert消息和連接將保持打開狀態。當收到「no_renegotiation」警報時,較舊版本的SunJSSE將關閉連接。
  • SSLv3:應用程序將收到SSLHandshakeException,連接將被關閉(handshake_failure)。 (「no_renegotiation」未在SSLv3的規範中定義)

要設置這些模式中,兩個系統的屬性被用來:

  • sun.security.ssl.allowUnsafeRenegotiation - 在第1階段中引入,該控制是否遺留(不安全)的重新談判是允許的。
  • sun.security.ssl.allowLegacyHelloMessages - 在階段2中引入,這允許對等方握手而不需要正確的RFC 5746消息。

如果仍然沒有幫助,您可以嘗試打開SSL dedug,並採取看看握手。
-Djavax.net.debug=all

+0

非常感謝。設置這些屬性並沒有幫助。我試過調試。請參閱最新的問題。 – vpram86 2011-02-01 10:59:04

+1

這將是添加的方式:System.setProperty(「sun.security.ssl.allowUnsafeRenegotiation」,「true」); System.setProperty(「sun.security.ssl.allowLegacyHelloMessages」,「true」); – tibi 2014-02-03 14:22:56

1

我仍然認爲這是一個TLS/SSL協商問題。

提出調試信息後,它顯示您正在執行TLSv1握手。

您確定您的瀏覽器中啓用了TLSv1嗎?

鉻: 爲了在Chrome中啓用TLS 1.0請執行下列操作:

  1. 點擊扳手圖標:
  2. 選擇選項
  3. 選擇 「引擎蓋下」 選項卡
  4. 單擊更改代理設置
  5. 選擇「高級」選項卡
  6. 滑動並檢查TLS 1.0
  7. 關閉並重新啓動所有打開的瀏覽器。

IE:

  1. 單擊工具菜單
  2. 單擊Internet選項
  3. 高級選項卡
  4. 滾動到安全部分
  5. 啓用TLS 1.0

火狐:

  1. 單擊工具
  2. 單擊選項
  3. 高級選項卡
  4. 加密選項卡
  5. 啓用TLS 1.0

然後你還提到:

這是消息在哪裏服務器 發送其證書與請求 客戶端證書,我相信一起。

您是否已將客戶端證書安裝到您正在測試的每個Web瀏覽器中?

確保你能得到的一切,而不相互/客戶認證工作,然後再一次它的工作,在將其重新添加。

3

我得到這個時,我不小心把非ssl端口在URL中,但開始與https的URL。衛生署。

有時最簡單的解決方案就是我們忘記的解決方案!

相關問題