javax.net.ssl.trustStore没有得到更新

时间:2012-08-24 13:29:39

标签: java web-services java-ee axis2

下面是使用dev keystore调用第一个Web服务的示例代码 并使用stage keystore调用第二个Web服务。

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

}

我可以拨打第一个网络服务电话但是我在访问第二个网络服务电话时遇到了以下错误

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"位置。

当我评论第一次网络服务电话时,我可以访问第二个网络服务。

2 个答案:

答案 0 :(得分:4)

要清楚。我不知道Axis2实际上是出于某种原因“重用”或缓存,因为你说的是​​你提供的信任库系统属性;我最好的猜测是,它会在引擎盖下初始化一些读取属性的对象,在配置后不需要再次读取它。
您可以通过将所有受信任的证书放在同一个信任库中来解决这个问题。这将定义解决您的问题,因为您说您实际上可以成功连接到第二个Web服务  为什么你首先使用不同的信任商店?
如果必须,由于一些安全性要求(你有吗?),你应该研究一下你没有使用Axis的其他ssl属性。

答案 1 :(得分: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) {
            }
        }
    }
}

我希望这会有所帮助。