3
public class ResLookupGetService extends Service {
    ServerServicePortType getServerServicePort();
}
public interface ServerServicePortType {
    ServerServiceResponse doSoapMethod(RequestObject request, ParamObject parameters);
}

ServerServicePortType service = new ServerServiceGetService().getServerServicePort();
ServerServiceResponse response = service.doSoapMethod(request, parameters);

上記のコードは、相互 SSL 暗号化が必要になる前に SOAP サービスを呼び出すのに問題なく動作します。

オンにしたら、SSL コンテキストを作成して、次のように設定してみます。

ServerServicePortType service = new ServerServiceGetService().getServerServicePort();

BindingProvider bindingProvider = (BindingProvider) service;
    bindingProvider.getRequestContext().put(
        "com.sun.xml.internal.ws.transport.https.client.SSLSocketFactory",
        getSslContext().getSocketFactory());

ServerServiceResponse response = service.doSoapMethod(request, parameters);

そして、を作成するコードSSLContext:

public SSLContext getSslContext(String keyStorePath, String keyStoreType, String trustStorePath) {
  KeyStore keyStore = KeyStore.getInstance(keyStoreType);
  InputStream ksis = ClassLoader.getSystemResourceAsStream(keyStorePath);
  keyStore.load(ksis, "mypassword".toCharArray());
  ksis.close();

  KeyStore trustStore = KeyStore.getInstance("JKS");
  InputStream tsis = ClassLoader.getSystemResourceAsStream(trustStorePath);
  trustStore.load(tsis, "mypassword".toCharArray());
  tsis.close();

  TrustManagerFactory tmf =
      TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
  tmf.init(trustStore);

  KeyManagerFactory kmf =
      KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());
  kmf.init(keyStore, "mypassword".toCharArray());

  sslContext = SSLContext.getInstance("TLS");
  sslContext.init(kmf.getKeyManagers(), tmf.getTrustManagers(), null);
  return sslContext;
}

しかし、資格情報を正しく渡していないようです。これを正しく設定していますか?

ありがとう

4

1 に答える 1

2

結局のところ、BindingProvider何も使用しないでください(または、少なくとも、違いが生じるまで使用できませんでした)。

Webサービスを呼び出す呼び出しの前に、次のシステムプロパティを設定するだけです。

  private void setSystemProps() {

    String keyStoreFileName = "ssl/clientKeyStore.jks";
    String keyStorePath = ClassLoader.getSystemResource(keyStoreFileName).getPath();
    String keyStoreType = "JKS";
    String keyStorePassword = "mypassword";

    String trustStoreFileName = "ssl/clientTruststore.jks";
    String trustStorePath = ClassLoader.getSystemResource(trustStoreFileName).getPath();
    String trustStoreType = "JKS";
    String trustStorePassword = "mypassword";

    Properties systemProps = System.getProperties();
    systemProps.put("javax.net.ssl.keyStore", keyStorePath);
    systemProps.put("javax.net.ssl.keyStorePassword", trustStorePassword);
    systemProps.put("javax.net.ssl.keyStoreType", keyStoreType);

    systemProps.put("javax.net.ssl.trustStore", trustStorePath);
    systemProps.put("javax.net.ssl.trustStoreType", trustStoreType);
    systemProps.put("javax.net.ssl.trustStorePassword", keyStorePassword);
    System.setProperties(systemProps);
  }

次に、通常のようにサービスコールを実行できます。

ServerServicePortType service = new ServerServiceGetService().getServerServicePort();
ServerServiceResponse response = service.doSoapMethod(request, parameters);

システムプロパティを設定しているとき、それらは値としてanyを受け入れ、Object元々は文字列ではなくURLオブジェクトに誤って設定していたことに注意してください。

したがって、trustStorePathおよびkeyStorePath変数は.getPath()、次のような絶対ファイルパスである値に設定されます。

"/Users/username/path/to/directory/with/ssl/clientKeyStore.jks"

これですべてが機能します。

于 2012-08-10T19:44:03.990 に答える