1

以下は、devキーストアを使用して1番目のWebサービスを呼び出し、ステージキーストアを使用して2番目の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

}

最初のWebサービス呼び出しを呼び出すことはできますが、2番目の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サービス呼び出しにコメントすると、2番目のWebサービスにアクセスできます。

4

2 に答える 2

4

ただ明確にします。Axis2あなたが提供したトラストストアシステムプロパティを言うように、実際に何らかの理由で「再利用」するのかキャッシュするのかはわかりません。私の最善の推測は、プロパティを読み取る内部のオブジェクトを初期化し、構成後に再度読み取る必要がないことです。
ただし、すべての信頼できる証明書を同じトラストストアに配置することで、これを回避できます。あなたが言うように、あなたは実際に2番目のWebサービスにうまく接続できるので、これは間違いなくあなたの問題を解決します。
そもそもなぜ別のトラストストアを使用しているのですか?
必要な場合は、セキュリティ要件があるため(持っていますか?)、Axis特に使用していない他のsslプロパティがあるかどうかを調べる必要があります。

于 2012-08-24T15:09:51.580 に答える
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) {
            }
        }
    }
}

これがお役に立てば幸いです。

于 2012-08-24T16:03:13.293 に答える