2011-02-16 81 views
1

我必須使用我的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); 

回答

0

我認爲你必須配置,可以信任未簽名的證書。也許this會幫助你。

0

爲了信任證書,您必須告訴java您相信簽署證書的證書頒發機構。如果是自簽證書,那就是證書本身。您需要將javax.net.ssl.trustStore系統屬性設置爲包含您要連接的服務器證書的CA的密鑰庫。

當您獲取證書以通過不可信的連接錯誤時,您可能能夠從瀏覽器獲取證書。嘗試找到一個選項以PKCS12格式導出證書,並保存該文件。在運行代碼時,將javax.net.ssl.trustStore屬性設置爲剛剛保存的文件,並將javax.net.ssl.trustStoreType設置爲PKCS12。

+0

我會嘗試這一點,並讓你知道。我試圖導出DER格式化的X509文件並將其導入「cacerts」,但它不起作用。 – Ezequiel 2011-02-16 07:06:23

+0

我試過這兩件事。 – Ezequiel 2011-02-16 08:12:58