Java 如何使用动态SSL身份验证创建Soap客户端?

Java 如何使用动态SSL身份验证创建Soap客户端?,java,ssl-certificate,soap-client,pfx,Java,Ssl Certificate,Soap Client,Pfx,我有一个用PFX文件调用web服务的代码 System.setProperty("javax.net.ssl.keyStoreType", "pkcs12"); System.setProperty("javax.net.ssl.keyStore", pathPFX); System.setProperty("javax.net.ssl.keyStorePassword", pass); System.setProperty("sun.security.ssl.allowUnsafeRenego

我有一个用PFX文件调用web服务的代码

System.setProperty("javax.net.ssl.keyStoreType", "pkcs12");
System.setProperty("javax.net.ssl.keyStore", pathPFX);
System.setProperty("javax.net.ssl.keyStorePassword", pass);
System.setProperty("sun.security.ssl.allowUnsafeRenegotiation", "true");
QName serviceName = new QName("www.example.org", "example");

//QName for Port As defined in wsdl.
QName portName = new QName("www.example.org", "exampleSOAP");

// Create a dynamic Service instance
Service service = Service.create(serviceName);

// Add a port to the Service
service.addPort(portName, SOAPBinding.SOAP11HTTP_BINDING, endpointAddress);

//Create a dispatch instance
Dispatch<SOAPMessage> dispatch = service.createDispatch(portName, SOAPMessage.class, Service.Mode.MESSAGE); 

MessageFactory factory = MessageFactory.newInstance();

SOAPMessage request = factory.createMessage();

// Object for message parts
SOAPPart sp = request.getSOAPPart();
StreamSource prepMsg = new StreamSource(new FileInputStream(pathXML));
sp.setContent(prepMsg);

// Save message
request.saveChanges();

SOAPMessage reply = null;
boolean success = true;
String response = "";
try {
    //Invoke Endpoint Operation and read response
    reply = dispatch.invoke(request);
    ByteArrayOutputStream out = new ByteArrayOutputStream();
    reply.writeTo(out);
    creaXMLResponse(out.toString());
} 
catch (WebServiceException wse)
{
  wse.printStackTrace();
    success = false;
}
System.setProperty(“javax.net.ssl.keyStoreType”、“pkcs12”);
setProperty(“javax.net.ssl.keyStore”,pathPFX);
setProperty(“javax.net.ssl.keystrepassword”,pass);
System.setProperty(“sun.security.ssl.allowUnsaference”、“true”);
QName serviceName=新的QName(“www.example.org”,“example”);
//wsdl中定义的端口的QName。
QName portName=新的QName(“www.example.org”、“exampleSOAP”);
//创建动态服务实例
Service=Service.create(serviceName);
//将端口添加到服务
addPort(端口名,SOAPBinding.SOAP11HTTP_绑定,端点地址);
//创建分派实例
Dispatch Dispatch=service.createDispatch(端口名,SOAPMessage.class,service.Mode.MESSAGE);
MessageFactory=MessageFactory.newInstance();
SOAPMessage请求=factory.createMessage();
//消息部分的对象
SOAPPart sp=request.getSOAPPart();
StreamSource prepMsg=新的StreamSource(新的FileInputStream(pathXML));
sp.setContent(prepMsg);
//保存消息
request.saveChanges();
SOAPMessage reply=null;
布尔成功=真;
字符串响应=”;
试一试{
//调用端点操作并读取响应
reply=dispatch.invoke(请求);
ByteArrayOutputStream out=新建ByteArrayOutputStream();
答复.书面通知(发出);;
creaXMLResponse(out.toString());
} 
捕获(WebServiceException wse)
{
wse.printStackTrace();
成功=错误;
}
它工作得很好,但现在我必须为不同的客户端使用不同的PFX文件,它们将在同一个tomcat上运行

使用此代码将使我重新启动tomcat以使用不同的PFX,因此我需要创建一种动态方式来选择PFX作为密钥库,但不使用JKS文件(客户端数量将增加,并且我不能每次都创建新的JKS)

注意:我一直在阅读有关使用密钥库和SSLContext的内容,但我不知道如何将它们链接到我的实际代码


提前感谢

顾名思义,密钥库可以存储多个密钥,而不仅仅是一个。所以,常见的方法是将与所有服务器握手所需的所有密钥存储在同一密钥库中

查看keytool手册页面,这方面有很多教程