2012-08-24 411 views
1

以下是使用dev密鑰庫 調用第1個Web服務並使用stage keystore調用第2個Web服務的示例代碼。javax.net.ssl.trustStore沒有得到更新

public static void main(String args[]) { 

    System.setProperty("javax.net.ssl.trustStore", 
      "C:\\Users\\shahire\\Desktop\\Keystores\\Keystores\\dev\\dev.keystore"); 
    System.out.println("1st web service call"); 
      // 1st axis2 web service call code 

    System.setProperty("javax.net.ssl.trustStore", 
     "C:\\Users\\shahire\\Desktop\\Keystores\\Keystores\\stage\\stage.keystore"); 
    System.out.println("2nd web service call"); 
      // 2nd axis2 web service call code 

} 

我能夠調用第一個Web服務調用,但是我已經越來越下面的錯誤,而第二個訪問Web服務調用

org.apache.axis2.AxisFault:sun.security.validator.ValidatorException:PKIX路徑構建失敗:sun.security.provider.certpath.SunCertPathBuilderException:無法找到有效的認證路徑要求的目標 在org.apache.axis2.AxisFault.makeFault(AxisFault.java:417)

通過查看異常我覺得它緩存「javax.net.ssl.trustStore」的位置。

當我評論第一個Web服務調用,然後我可以訪問第二個Web服務。

+0

你使用哪個應用程序服務器? –

+0

Java只讀取一次系統屬性。您不需要兩個單獨的信任庫:將它們合併。如果你認爲你需要兩個,你會以某種方式濫用這個設施。 – EJP

回答

4

只是要清楚。我不知道Axis2是否因爲某些原因「重用」或緩存,因爲您說的是您提供的truststore系統屬性;我最好的猜測是它初始化讀取屬性的引擎下的某個對象,並且在它被配置後不需要再次讀取它。
但是你可以通過把這個工作放在這個位置,把你所有的可信證書放在同一個信任庫。這將定義解決你的問題,因爲你說你實際上可以成功地連接到第二個Web服務。
爲什麼你首先使用不同的信任庫?
由於某些安全要求(您是否有?),您應該考慮是否還有其他專用於您的Axis的ssl屬性。

0

您可以在不修改JVM提供的屬性的情況下嘗試其他方式。

下面是一個簡單例子:

package test.ssl; 

import java.io.BufferedReader; 
import java.io.FileInputStream; 
import java.io.InputStream; 
import java.io.InputStreamReader; 
import java.net.URL; 
import java.security.KeyStore; 

import javax.net.ssl.HttpsURLConnection; 
import javax.net.ssl.KeyManagerFactory; 
import javax.net.ssl.SSLContext; 
import javax.net.ssl.SSLSocketFactory; 
import javax.net.ssl.TrustManagerFactory; 

public class SSLClient { 

    public void provider() throws Exception { 
     // first call 
     invokeWebServiceSSL(".../.../.../name.keystore", "changeit", 
       "https://../../"); 
     // second call 
     // invokeWebServiceSSL(String keystorePath, String pass, String 
     // endpointURL) 
    } 

    public static void invokeWebServiceSSL(String keystorePath, String pass, String endpointURL) { 
     HttpsURLConnection conn = null; 
     try { 

      char[] password = pass.toCharArray(); 
      FileInputStream fis = new FileInputStream(keystorePath); 
      KeyStore ks = KeyStore.getInstance(KeyStore.getDefaultType()); 
      ks.load(fis, password); 

      KeyManagerFactory kmf = KeyManagerFactory.getInstance("SunX509"); 
      kmf.init(ks, password); 

      TrustManagerFactory tmf = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm()); 
      tmf.init(ks); 
      fis.close(); 

      SSLContext ctx = SSLContext.getInstance("SSL"); 
      ctx.init(kmf.getKeyManagers(), tmf.getTrustManagers(), null); 
      SSLSocketFactory sf = ctx.getSocketFactory(); 

      URL url = new URL(endpointURL); 
      conn = (HttpsURLConnection) url.openConnection(); 
      conn.setSSLSocketFactory(sf); 

      InputStream inputstream = conn.getInputStream(); 
      InputStreamReader inputstreamreader = new InputStreamReader(inputstream); 
      BufferedReader bufferedreader = new BufferedReader(inputstreamreader); 

      String rs = null; 
      while ((rs = bufferedreader.readLine()) != null) { 
       System.out.println("Received: " + rs); 
      } 

     } catch (Exception e) { 
      e.printStackTrace(); 
     } finally { 
      try { 
       conn.getInputStream().close(); 
      } catch (Exception e) { 
      } 
     } 
    } 
} 

我希望這有助於。