我必須使用我的Java Web應用程序(在Tomcat上運行)來使用Axis中完成的web服務。做web服務的公司使用HTTPS和自簽名的測試證書。使用Java和Tomcat的webservice中的SSL握手問題
我已經運行Netbeans wizzard來生成基於WSDL的Web服務,並且這是正確的。如果我使用瀏覽器進入web服務的網站,由於SSL證書,我收到警告,我必須創建一個例外。
當試圖運行我的代碼時,SSL連接發生時會出現異常。唯一的例外是:
1.
com.sun.xml.ws.client.ClientTransportException: HTTP transport error: javax.net.ssl.SSLHandshakeException: Received fatal alert: handshake_failure
一些時間(不改變代碼)
2.
com.sun.xml.ws.client.ClientTransportException: HTTP transport error: javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
我想,我一定要結合證書導入Java VM和/或Tomcat,並且還告訴忽略這不是可信的來源。
如何做到這一點?如何正確使用這個安全的web服務?
如果我提供的信息不夠,請詢問更多。
感謝
埃塞基耶爾
UPDATE:
我已經試過這兩個東西,都沒有成功,唯一的例外是相同的。
項1)
System.setProperty("javax.net.ssl.trustStore","/home/serverapp/BSS-cert.p12");
System.setProperty("javax.net.ssl.trustStorePassword","password");
System.setProperty("javax.net.ssl.trustStoreType","PKCS12");
選項2) 密鑰庫KS = KeyStore.getInstance( 「PKCS12」); (新的FileInputStream(「/ home/serverapp/BSS-cert.p12」),「password」.toCharArray());
KeyStore jks = KeyStore.getInstance("JKS");
jks.load(null);
KeyManagerFactory kmf = KeyManagerFactory.getInstance("SunX509");
kmf.init(ks, "f0p6k9n2".toCharArray());
TrustManagerFactory tmf = TrustManagerFactory.getInstance("SunX509");
tmf.init(jks);
SSLContext ctx = SSLContext.getInstance("TLS");
ctx.init(kmf.getKeyManagers(), tmf.getTrustManagers(), null);
而且,我認爲可能是問題是Web服務,我想囑咐HTTPS連接,並開擴的輸入流時,它失敗了同樣的錯誤。
String httpsURL = "https://serverurl:443/theservice?wsdl";
URL myurl = new URL(httpsURL);
HttpsURLConnection con = (HttpsURLConnection)myurl.openConnection();
InputStream ins = con.getInputStream(); //Exception here!
InputStreamReader isr = new InputStreamReader(ins);
BufferedReader in = new BufferedReader(isr);
我會嘗試這一點,並讓你知道。我試圖導出DER格式化的X509文件並將其導入「cacerts」,但它不起作用。 – Ezequiel 2011-02-16 07:06:23
我試過這兩件事。 – Ezequiel 2011-02-16 08:12:58