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

Java 1.7代码工作正常,但在1.6中,它会因握手错误而中断,java,ssl,handshake,sslhandshakeexception,Java,Ssl,Handshake,Sslhandshakeexception,我试图用SSL在JAVA中调用soap API,JAVA 1.7正在工作,但1.6不工作 我正在获取:javax.net.ssl.SSLHandshakeException:收到致命警报:握手失败 为什么Java1.7可以工作,而1.6不能工作 System.setProperty("javax.net.ssl.keyStore", "C:\\Users\\user\\Desktop\\SoapUI (1)\\SoapUI\\x.p12"); System.setProperty("javax.

我试图用SSL在JAVA中调用soap API,JAVA 1.7正在工作,但1.6不工作

我正在获取:javax.net.ssl.SSLHandshakeException:收到致命警报:握手失败

为什么Java1.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

现在它显然不适用于您,并且看起来您使用的属性值正确。我怀疑问题在于,您在system properties对象中设置网络属性的时间太晚,以至于它们无法发挥任何作用。尝试使用命令行属性设置它们

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

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

参考资料:


您应与管理层和客户分享以下信息:

  • 您/他们不应该使用Java 6或Java 7。。。除非您/他们有Oracle Java支持合同并且正在使用最新的非公开版本。Java6或Java7的公共版本是EOL。自2013年4月起,Java 6已下线。您缺少的安全修补程序有很多

  • 您/他们不应使用TLS 1.0。它不再被认为是安全的。有人这样说:

    “TLS 1.0是TLS的第一个版本,在世界上相当普遍,需要在客户端和服务器上采取变通办法才能安全地为所有密码套件工作。TLS 1.0也无法使用提供更高安全性和效率的现代密码套件。”


请看,但人们也应该问:为什么要使用Java 6或Java 7来运行web内容?都是下线!我别无选择谁给了你别无选择,只能升级。到底是哪个Java 1.6?太阳报/甲骨文?免费(通过6u45)还是付费(更高)?OpenJDK?国际商用机器公司苹果?安卓可能是SNI;您是否可以测试使用
openssl s_client
连接(仅连接,无数据)以及是否使用
-servername$host