如何在 Java7 中为 Axis1 webservice 客户端启用 TLS1.1

Ven*_*jan 4 salesforce java-7 salesforce-communities

总结:Salesforce.com 最近为其沙盒实例 (test.salesforce.com) 禁用了 TLSv1,并且只能支持 TLSv1.1 及更高版本的 API 集成,用于入站和出站请求。

我使用 Java Axis1.0 客户端代码和 JDK 7.0 连接(通过 webservice soap)到 salesforce.com。我收到异常“UNSUPPORTED_CLIENT:TLS 1.0 已在该组织中禁用。使用 https 连接到 Salesforce 时,请使用 TLS 1.1 或更高版本。” With Java7.0 Supported Protocols:SSLv2Hello, SSLv3, TLSv1, TLSv1.1, TLSv1.2 Enabled Protocols: TLSv1

`使用Java8.0,当我尝试使用java8 客户端连接到salesforce.com 时,连接成功。

支持的协议:SSLv2Hello、SSLv3、TLSv1、TLSv1.1、TLSv1.2 启用协议:TLSv1、TLSv1.1、TLSv1.2`

我必须使用 Java 7,因为我们的应用程序正在使用它。我尝试设置虚拟机参数: -Dhttps.protocols=TLSv1.1,TLSv1.2 -Ddeployment.security.SSLv2Hello=false -Ddeployment.security.SSLv3=false -Ddeployment.security.TLSv1=false -Ddeployment.security.TLSv1.1 =true -Ddeployment.security.TLSv1.2=true”但没有成功。

你能帮我找出 Java7 中的设置来启用 TLSv1.1 吗?

Ven*_*jan 5

找到了解决办法:

我必须编写自定义 JSSESocketFactory(因为我使用的是 Java webservice Axis1.0 客户端)和 AxisProperties 设置。

就像是,

public class TLSSocketSecureFactory extends JSSESocketFactory {

private final String TLS_VERSION_1_1 = "TLSv1.1";
private final String TLS_VERSION_1_2 = "TLSv1.2";

public TLSSocketSecureFactory(@SuppressWarnings("rawtypes") Hashtable attributes) {
super(attributes);
}

@Override
protected void initFactory() throws IOException {
SSLContext context;
try {
  context = SSLContext.getInstance(TLS_VERSION_1_1);
  context.init(null, null, null);
  sslFactory = context.getSocketFactory();
} catch (NoSuchAlgorithmException | KeyManagementException e) {
  //printstacktrace or throw IOException
}
}

@Override
public Socket create(String host, int port, StringBuffer otherHeaders, BooleanHolder useFullURL) throws Exception {
if (sslFactory == null) {
  initFactory();
}
Socket s = super.create(host, port, otherHeaders, useFullURL);
((SSLSocket) s).setEnabledProtocols(new String[] {TLS_VERSION_1_1, TLS_VERSION_1_2 });
return s;
}
}
Run Code Online (Sandbox Code Playgroud)

AxisProperties.setProperty("axis.socketSecureFactory",TLSSocketSecureFactory.class.getCanonicalName());

这仅对 JDK7 是必需的。当应用程序迁移到 JDK8 时,不需要这个类。在 Java8 TLSv1.1 和 TLS1.2 中默认启用。

注意:在服务器上设置 VM 配置在这里对于 Axis java 客户端没有帮助。