1.7代码工作正常,但在1.6中它会因握手错误而中断

问题描述 投票:0回答:1

我试图用SSL调用JAVA中的soap API,java 1.7正在运行,但1.6无效。

我得到:javax.net.ssl.SSLHandshakeException:收到致命警报:handshake_failure

为什么用java 1.7工作,但1.6不起作用?

System.setProperty("javax.net.ssl.keyStore", "C:\\Users\\user\\Desktop\\SoapUI (1)\\SoapUI\\x.p12");
System.setProperty("javax.net.ssl.keyStorePassword", "passX!");
System.setProperty("javax.net.ssl.keyStoreType", "PKCS12");
System.setProperty("https.protocols", "TLSv1");



URL u = null;
try {
    u = new URL("https://x1/x2WS/x3?wsdl");
} catch(Exception ex) {
    ex.printStackTrace();
}
JobInput2Service service = new JobInput2Service(u);
JobInput2 job = service.getJobInput2Port();
try {
    HelloRequestParm parm = new HelloRequestParm();
    parm.setMessage("value");
    HelloResponseData res = job.sayHello(parm);
    System.out.print("\n res: "+res.getMessage());
} catch (Exception ex) {
    ex.printStackTrace();
}
java ssl handshake sslhandshakeexception
1个回答
1
投票

根据下面的参考资料,Java 6.0(所有版本)都支持TLS 1.0。

现在它显然不适合你,看起来你正在使用正确的属性值。我怀疑问题是你在系统属性对象中设置网络属性太晚了,他们没有任何效果。尝试使用-Dname=value命令行属性来设置它们。

如果以编程方式设置系统属性,则需要在使用它们之前执行此操作。网络属性通常在触发静态初始化时使用,并且通常早于您在应用程序生命周期中的想法。

但是,有一件事困扰着我。根据其中一个参考资料,TLS 1.0是Java 6.0的默认设置。如果这是正确的,则根本不需要设置“https.protocols”来获得TLS 1.0。因此,如果我的上述建议不起作用,则下一步应该是添加-Djavax.net.debug=all并查看尝试建立HTTPS连接时生成的日志消息。

参考文献:


您应与您的管理层和客户分享以下内容:

  • 您/他们不应该使用Java 6或Java 7 ...除非您/他们有Oracle Java支持合同并且正在使用最近的非公开发布。 Java 6或Java 7的公开发行版是EOL。 Java 6自2013年4月开始一直是EOL。这是你缺少的许多安全修复程序!
  • 您/他们不应该使用TLS 1.0。它不再被认为是安全的。一个source说: “TLS 1.0是TLS的第一个版本,在世界上相当普遍,并且需要客户端和服务器的解决方法才能安全地为所有密码套件工作.TLS 1.0也无法使用提供更高安全性和效率的现代密码套件“。
© www.soinside.com 2019 - 2024. All rights reserved.