如何将 SSLContext 与轴一起使用
How do I use SSLContext with axis
我有一个 Web 应用程序调用需要 SSL 证书的 Web 服务。我们有一个 class 实现了 X509KeyManager 来获取证书,我可以用那个密钥管理器构建一个 SSLContext 的实例,但我没有运气使用它。
我使用 wsdl2java 为使用 axis (1) 的请求生成 classes,不幸的是我找到的所有解决方案都是针对 axis2 的。
以下是我为 axis2 找到的几个解决方案,但我无法使用 axis (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));
我是这样实现的:
我创建了一个扩展 JSSESocketFactory 的 class,类似于 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());
我有一个 Web 应用程序调用需要 SSL 证书的 Web 服务。我们有一个 class 实现了 X509KeyManager 来获取证书,我可以用那个密钥管理器构建一个 SSLContext 的实例,但我没有运气使用它。
我使用 wsdl2java 为使用 axis (1) 的请求生成 classes,不幸的是我找到的所有解决方案都是针对 axis2 的。
以下是我为 axis2 找到的几个解决方案,但我无法使用 axis (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));
我是这样实现的:
我创建了一个扩展 JSSESocketFactory 的 class,类似于 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());