每个客户端实例的JAX-WS更改或删除信任证书存储

时间:2018-10-31 17:03:53

标签: java ssl jax-ws truststore

使用JAX WS,我设法开发了一个Web服务客户端,该客户端负责发送记录。 SSL与服务器的连接受信任,因此我使用下面的代码告诉客户端如何管理与服务器的握手。 但是现在我需要能够动态告诉客户端选择信任存储的方式:

如果我使用参数调用客户端,我将使用cacerts1 如果我使用另一个参数调用第二个客户端,我将使用cacerts2 如果我用另一个参数呼叫第三个客户端,我不想使用任何信任库

另一种情况是:

Client1 ---> use Certificate1 ----> Server1

Client2 ---> use Certificate2 ----> Server1

Server1在certificate1和2中使用一些信息来转发client1和client2在2个不同的位置(store1和store2)发送的消息。

import java.net.URL;
import javax.xml.namespace.QName;
import javax.xml.ws.Service;
import javax.xml.ws.WebEndpoint;
import javax.xml.ws.WebServiceClient;
import javax.xml.ws.WebServiceException;
import javax.xml.ws.WebServiceFeature;    

public class MyProxy extend Service {

private static final EndOfDayService SERVICE = new EndOfDayService();

// Web service port to call services
private final MyPort port;

public MyProxy(String baseurl, SSLSocketFactory sslFactory, boolean compression) {       
    port = super.getPort(...);

    Map<String, Object> context = ((BindingProvider) port).getRequestContext();
    if (baseurl != null) {
        context.put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY, baseurl);
    }
    System.setProperty("javax.net.ssl.keyStoreType", "pkcs12");
    System.setProperty("javax.net.ssl.trustStoreType", "pkcs12");
    System.setProperty("javax.net.ssl.keyStore", "C:\\path\\to\\my\\cacerts");
    System.setProperty("javax.net.ssl.trustStore", "C:\\path\\to\\my\\cacerts");
    System.setProperty("javax.net.debug", "SSL");
    System.setProperty("javax.net.ssl.keyStorePassword", "mypwd");
    System.setProperty("javax.net.ssl.trustStorePassword","mypwd");

    sslFactory = (SSLSocketFactory) SSLSocketFactory.getDefault();

    if (sslFactory != null) {
        context.put(JAXWSProperties.SSL_SOCKET_FACTORY, sslFactory);
    }

    // For debugging only: don't check host name in server certificate when pointing to localhost
    context.put(JAXWSProperties.HOSTNAME_VERIFIER, new HostnameVerifier() {

        @Override
        public boolean verify(String hostName, SSLSession session) {
            if (hostName.equals("localhost")) {
                return true;
            }
            return false;
        }
    });


    }
}

public String record(List<EndOfDayInstance> records) throws SystemFaultException, UserFaultException {
    return port.sendrecord(records);
}

}

使用此代码,我为整个过程设置了cacerts存储,因此在同一过程中的其他并行客户端(例如之前Client1和Client2的情况)将使用该设置。

但是如果同一过程中的其他客户端之一想要访问另一个信任库怎么办?

如何仅针对Web服务客户端的单个实例动态更改信任库,而又不影响其他实例?并更改它的运行时?

我怎么只有一家商店,并指定client1必须使用certificate1,而client2必须使用certificate2进行握手?

0 个答案:

没有答案