如何强制Axis客户端使用TLSv1.2协议

时间:2015-12-09 13:42:21

标签: ssl axis webservices-client tls1.2

我们的应用程序与之集成的第三方最近对其安全级别协议进行了更改。简而言之,My Axis客户端现在应该使用TLSv1.1或TLSv1.2发送呼叫。 我已经看过其他有关此事的帖子,并提出了一些好主意:

  1. here
  2. here
  3. 在代码中进行了这些更改后,我再次触发了调用, 我使用了一个剪切工具来监控发送的包,我仍然在SSL层中看到正在使用的协议是TLSv1。

    the packet snippet

    我在这里做错了什么?

    这就是我设置新SocketSecureFactory的方式:

    AxisProperties.setProperty("axis.socketSecureFactory", MyTLSSocketSecureFactory.class.getName());
    

    而MyTLSSocketSecureFactory是:

    public class MyTLSSocketSecureFactory extends JSSESocketFactory {
        public MyTLSSocketSecureFactory(Hashtable attributes) {
            super(attributes);
        }
    
        @Override
        public Socket create(String host,int port,   StringBuffer otherHeaders,BooleanHolder useFullURL)
                  throws Exception{
            Socket s = super.create(host, port, otherHeaders, useFullURL);
            ((SSLSocket)s).setEnabledProtocols(new String[] {"TLSv1.1", "TLSv1.2"});
            return s;
        }
    }
    

    非常感谢任何评论, 感谢。

3 个答案:

答案 0 :(得分:6)

在MyTLSSocketSecureFactory类中,您需要创建自己的SSLContext实例,然后从上下文中获取sslFactory。

重写initFactory()方法,例如:

initFactory() {
  SSLContext context = SSLContext.getInstance("TLSv1.2");
  context.init(null, null, null);
  sslFactory = context.getSocketFactory();
}

答案 1 :(得分:1)

您也可以只更改默认的SSLContext

    SSLContext sslContext = SSLContext.getInstance("TLSv1.2");
    sslContext.init(null, null, null);
    SSLContext.setDefault(sslContext);

答案 2 :(得分:0)

另见https://github.com/unkascrack/axis-ssl他们引入了SSLClientAxisEngineConfig EngineConfiguration实现来启用TLS。