我试图用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 6.0(所有版本)都支持TLS 1.0。
现在它显然不适合你,看起来你正在使用正确的属性值。我怀疑问题是你在系统属性对象中设置网络属性太晚了,他们没有任何效果。尝试使用-Dname=value
命令行属性来设置它们。
如果以编程方式设置系统属性,则需要在使用它们之前执行此操作。网络属性通常在触发静态初始化时使用,并且通常早于您在应用程序生命周期中的想法。
但是,有一件事困扰着我。根据其中一个参考资料,TLS 1.0是Java 6.0的默认设置。如果这是正确的,则根本不需要设置“https.protocols”来获得TLS 1.0。因此,如果我的上述建议不起作用,则下一步应该是添加-Djavax.net.debug=all
并查看尝试建立HTTPS连接时生成的日志消息。
参考文献:
您应与您的管理层和客户分享以下内容: