我正在尝试使用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();
}
答案 0 :(得分: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支持合同并且正在使用最新的非公开发行版。 EOL是Java 6或Java 7的公共发行版。 Java 6自2013年4月以来就已经停产。这是您丢失的很多安全修复程序!
您/他们不应该使用TLS 1.0。它不再被认为是安全的。一个source这样说:
“ TLS 1.0是TLS的第一个版本,在世界范围内相当普遍,并且要求客户端和服务器中的变通办法都可以安全地用于所有密码套件。TLS1.0也无法使用现代密码套件提供更高的安全性和效率。”