我試圖連接到一個安全的web服務。爲什麼在SSL握手期間java不發送客戶端證書?
即使我的密鑰存儲庫和信任庫已正確設置,我仍遇到握手失敗。
經過幾天的沮喪,無盡的谷歌搜索,並詢問身邊的每一個人,我發現唯一的問題是java握手期間選擇不發送客戶端證書到服務器。
具體做法是:
- 服務器請求客戶端證書(CN =根CA) - 即「給我,由根CA簽署的證書」
- 的Java看着密鑰庫,只發現我的客戶證書由「SubCA」簽名,而「SubCA」則由「RootCA」簽發。它沒有費心去查看信任庫......嗯好吧我猜
- 很遺憾,當我試圖將「SubCA」證書添加到密鑰庫時,根本沒有任何幫助。我沒有檢查證書是否加載到密鑰庫中。他們這樣做,但KeyManager忽略除客戶端之外的所有證書。
- 所有上述導致了Java的決定它不具有滿足服務器的請求的任何證書,併發送什麼... tadaaa握手失敗:-(
我的問題的事實:
- 是否有可能將「SubCA」證書以「破壞證書鏈」或其他方式添加到密鑰庫中,以便KeyManager僅加載客戶端證書並忽略其餘部分?(Chrome和openssl管理圖形那麼爲什麼不能java? - 請注意,「SubCA」證書總是作爲受信任的權威機構單獨列出,以適應Chrome應用程序在握手過程中將其與客戶端證書一起正確包裝)
- 這是服務器端的正式「配置問題」嗎?服務器是第三方。我希望服務器請求由「SubCA」權威機構簽署的證書,因爲這是他們提供給我們的。我懷疑,這在Chrome和openssl中起作用的事實是因爲它們「不那麼嚴格」,而java只是「靠本書」而失敗。
我的確設法解決了這個問題,但我對此並不滿意,所以如果有人能爲我澄清這一點,我會很高興。
值得向@Bruno的回答添加一個基本原因是存在一個私鑰但沒有相應的證書(即具有相同的別名),所以當被證書請求消息詢問時,Java不能發送一個證書。其他原因可能包括沒有指定服務器簽發的證書,或沒有與服務器指定的密碼匹配的證書。 – EJP 2014-02-05 05:41:55
我們解決了這個問題,只是匹配服務器指定的密碼。謝謝你們所有這些信息,這非常有用。 – 2016-05-20 20:19:01