我有一个Web应用程序,它调用需要SSL证书的Web服务。我们有一个实现X509KeyManager来获取证书的类,我可以使用该密钥管理器构建一个SSLContext实例,但我没有运气使用它。
我使用wsdl2java为使用axis(1)的请求生成类,遗憾的是我找到的所有解决方案都是针对axis2。
以下是我为轴2找到的一些解决方案,我无法用轴(1)进行复制:
//solution 1
BindingProvider bindingProvider = (BindingProvider) service;
bindingProvider.getRequestContext().put("com.sun.xml.internal.ws.transport.https.client.SSLSocketFactory", sslContext.getSocketFactory());
//solution 2
aStub._getServiceClient().getOptions().setProperty(HTTPConstants.CUSTOM_PROTOCOL_HANDLER, new Protocol("https",(ProtocolSocketFactory)new SSLProtocolSocketFactory(sslCtx),443));
答案 0 :(得分:3)
以下是我能够实现这一目标的方法:
我创建了一个扩展JSSESocketFactory的类,类似于SunJSEESocketFactory(org.apache.axis.components.net)
public class MySocketFactory extends JSSESocketFactory implements SecureSocketFactory {
...
protected void initFactory() throws IOException {
...
SSLContext context = getContext();
this.sslFactory = context.getSocketFactory();
...
}
protected SSLContext getContext() throws Exception {
MyKeyManager myKeyManager = new MyKeyManager();
KeyManager[] km = new X509KeyManager[] { myKeyManager };
SSLContext context = SSLContext.getInstance("SSLv3");
context.init(km, null, null);
return context;
}
}
然后在对需要证书的Web服务进行任何调用之前
AxisProperties.setProperty("axis.socketSecureFactory",
MySocketFactory.class.getCanonicalName());