我正在使用Java 6,並試圖使用客戶端證書針對遠程服務器創建HttpsURLConnection
。
服務器正在使用自簽名根證書,並要求提供受密碼保護的客戶端證書。我已將服務器根證書和客戶端證書添加到我在/System/Library/Frameworks/JavaVM.framework/Versions/1.6.0/Home/lib/security/cacerts
(OSX 10.5)中找到的默認Java密鑰庫中。 密鑰庫文件的名稱似乎暗示客戶端證書不應該進入那裏?通過HTTPS/SSL的Java客戶端證書
總之,添加根證書到這家店解決了臭名昭著的javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed' problem.
不過,現在我卡上如何使用客戶端證書。我嘗試了兩種方法,但都沒有把我帶到任何地方。
首先,也是首選,嘗試:
SSLSocketFactory sslsocketfactory = (SSLSocketFactory) SSLSocketFactory.getDefault();
URL url = new URL("https://somehost.dk:3049");
HttpsURLConnection conn = (HttpsURLConnection)url.openConnection();
conn.setSSLSocketFactory(sslsocketfactory);
InputStream inputstream = conn.getInputStream();
// The last line fails, and gives:
// javax.net.ssl.SSLHandshakeException: Received fatal alert: handshake_failure
我試着跳過HttpsURLConnection的類(不理想的,因爲我想談HTTP與服務器),而做到這一點,而不是:
SSLSocketFactory sslsocketfactory = (SSLSocketFactory) SSLSocketFactory.getDefault();
SSLSocket sslsocket = (SSLSocket) sslsocketfactory.createSocket("somehost.dk", 3049);
InputStream inputstream = sslsocket.getInputStream();
// do anything with the inputstream results in:
// java.net.SocketTimeoutException: Read timed out
我甚至不確定客戶端證書是否是這裏的問題。
這看起來像一個非常整潔的軟件包,但應該使它工作的類「AuthSSLProtocolSocketFactory」在4.0beta(儘管發行說明中指出它是)或3.1中都不是正式發佈的一部分。 我已經繞過它了一下,現在似乎永久卡住了5分鐘的掛起,然後才斷開連接。這真的很奇怪 - 如果我將CA和客戶端證書加載到任何瀏覽器中,它就會飛走。 – Jan 2009-05-19 11:58:30
Apache HTTP Client 4可以直接使用`SSLContext`,所以你可以這樣配置所有這些,而不是使用`AuthSSLProtocolSocketFactory`。 – Bruno 2010-09-14 22:00:26