首页 > 解决方案 > JAX-WS 更改或删除每个客户端实例的信任证书存储

问题描述

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

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

另一种情况是:

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

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

Server1 使用证书 1 和 2 中的一些信息来转发 client1 和 client2 在 2 diff 位置发送的消息: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 进行握手?

标签: javassljax-wstruststore

解决方案


推荐阅读