java - 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 进行握手?
解决方案
推荐阅读
- php - Wordpress 自定义帖子类型分页 404
- laravel - 困难的工作后队列关闭
- java - 如何修改我通过从api导入使用的android studio中的java代码
- python - OsmNx:SVG 和 PNG 图像具有不同的比例
- r - 查询 WikipediR 时,如何遍历一系列修订 ID?
- c# - c# DietPi下的Mono Cudafy运行失败
- java - 我如何将一小段黑色文本拆分为 Java 中的 Arraylist?
- android - Mapbox Android SDK:使用 symbolManager 添加制造商
- angularjs - 如何在AngularJS的index.route文件中注入configService
- angular - cdkDragFreeDragPosition 位置取决于之前的每个 cdkDrag 元素