如何将SSLContext与轴一起使用

时间:2015-02-13 17:08:31

标签: java ssl axis

我有一个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));

1 个答案:

答案 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());