2012-02-12 73 views
5

我通過HTTPS連接到Web服務。我已經完成了所有我認爲需要的工作,但最終我得到了握手失敗。我爲什麼會遇到握手故障(Java SSL)

我發現作爲一個新用戶,由於「垃圾郵件保護」,我不能發佈超過2個鏈接 - thanx很多stackoverflow ...無論如何,這裏是一個鏈接到一個pastebin帖子,所有鏈接拼寫出來。 ..所以當我寫「鏈接#1」這是這些鏈接的引用:http://pastebin.com/y4zGNRC7

  • 我使用的HttpClient(上取得成功的服務URL)和實際調用通過CXF代理Web服務驗證了相同的行爲我設置了密鑰庫和信任庫 - 我嘗試了「在代碼中」的方式(鏈接#1)和設置系統屬性 - 即System.setProperty(「javax.net.ssl.keyStore」,「mykeystore .jks「);
  • SSL調試是(javax.net.debug =全部)
  • SSL調試脫口而出兩個密鑰庫和信任的內容(即看起來像Java「知道他們」) - 鏈接#2
  • 好像有一些客戶端 - 服務器通信回事,但隨後崩潰出於某種原因鏈接3
  • 我在瀏覽器(Chrome)使用客戶端和CA證書都使用的OpenSSL的s_client.First
  • Wireshark的表演成功地連接到服務器來自java的更少的客戶端 - 服務器對話(鏈接#4)然後例如來自Chrome(鏈接#5)

另一個奇怪的現象是,當我設置密鑰庫並且不知道時(我唯一的區別是當我在控制檯中打印密鑰庫內容時,我似乎獲得了相同的行爲,但就是這樣)。

我試着用Google搜索這個問題,我在這裏看到了很多類似的帖子在stackoverflow,但沒有任何幫助。 我試着改變協議版本(「TLSv1」,「SSLv3」,甚至是怪異的v2 Hello)。 任何幫助,將不勝感激 - 也許有可能我忽略了一些基本的東西......我越來越絕望這裏... 感謝名單

PS我在Fedora Core 15運行Java 1.6更新30(64位)

+1

您可以發佈一個異常堆棧跟蹤? – home 2012-02-12 13:33:30

+0

*「我發現,作爲一個新的用戶我不能發佈超過2個鏈接由於「垃圾郵件防護」 - 比很多堆棧溢出「*。如果你使用這個網站很多,你會意識到SO的垃圾郵件防護措施是一件好事。 – 2012-02-12 13:43:31

+1

關於鏈接的主題,它被認爲是不好的形式發佈pastebin鏈接和類似的內容,因爲它們很快就會蒸發,使得這個問題對未來的讀者來說是無法理解的。 – 2012-02-12 13:50:49

回答

4

問題是,即使設置了密鑰庫和信任庫,java也決定不將客戶端證書發送到服務器。原因是服務器請求由RootCA授權機構簽署的證書,但客戶端證書由SubCA授權機構(由RootCA頒發)簽署。

最初密鑰庫只包含客戶端證書和信任庫SubCA證書。 然後我試着將SubCA證書添加到密鑰庫,但是java只是忽略了它。

所以這解決了hanshake失敗的奧祕,但不是我的問題。

我創建了一個單獨的問題爲...感嘆:-( why doesn't java send the client certificate during SSL handshake?

2

您提供的信息不足,但我猜測您的客戶端信任庫未正確配置。信任庫包含用於簽署其他證書的可信證書,並且必須包含服務器和客戶端證書鏈的根證書。客戶端密鑰庫包含客戶端SSL證書和私鑰。

+0

感謝您的回覆Greg。請告訴我更多我應該提供的信息。我試圖儘可能徹底,但我知道我可能錯過了一些東西。 正如我寫的,我設置了_truststore_和_keystore_。我確實在日誌中放入了X,而不是實際的證書名稱和內容,因爲我不想在網上發佈這些內容。密鑰庫包含客戶端證書和私鑰。信任庫包含頒發證書的CA證書和根CA證書。 棧跟蹤在這裏似乎沒有太大的幫助(我發佈在上面的評論中)。 – 2012-02-13 08:26:44

+0

似乎客戶**密鑰庫**被加載,但客戶端證書沒有被呈現給服務器,這就是握手失敗的原因。日誌顯示一個空的客戶端證書鏈。我不知道爲什麼:-( – 2012-02-14 10:52:56

1

我認爲不包含CA的信任存儲庫是最可能發生的問題。您可以使用Java keytool導入證書的網站爲cacerts文件做這樣的事情:

keytool -keystore pathtocacerts -import -trustcacerts -v -alias aliasName -file root.crt 

默認的cacerts密鑰存儲密碼是changeitcacerts文件通常在jre/lib/security目錄下。

+0

我很確定信任庫確實包含CA.當沒有工作時,我還將根CA證書導入到truststore中......但這似乎沒有幫助。 – 2012-02-13 09:57:53

+1

請注意,使用SSL調試時,truststore和keystore的內容會打印在控制檯中。此外,客戶端證書和CA證書(不是根目錄)足以使其在瀏覽器中正常工作。 – 2012-02-13 10:00:05

+0

我嘗試檢查用keytool和一切商店的內容似乎都沒問題我甚至嘗試在啓動時通過命令行選項設置這兩個商店(即'-Djavax.net.ssl.keyStore =')無濟於事...... – 2012-02-13 10:04:00