Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/367.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
HttpsURLConnection的已禁用证书验证仍在获取javax.net.ssl.SSLHandshakeException:收到致命警报:握手失败_Java_Ssl_Httpsurlconnection_Sslhandshakeexception - Fatal编程技术网

HttpsURLConnection的已禁用证书验证仍在获取javax.net.ssl.SSLHandshakeException:收到致命警报:握手失败

HttpsURLConnection的已禁用证书验证仍在获取javax.net.ssl.SSLHandshakeException:收到致命警报:握手失败,java,ssl,httpsurlconnection,sslhandshakeexception,Java,Ssl,Httpsurlconnection,Sslhandshakeexception,我正在编写一些代码,将HTTP GET/POST请求发送到目标服务器。当应用程序尝试建立到安全服务器(https)的连接时,问题就会出现。为此,我使用了HttpsURLConnection,如下所示: url = new URL("https://www.sendspace.com/"); String input, htmlResponse = ""; HttpsURLConnection con; con = (HttpsURLConnection)url.openConnection()

我正在编写一些代码,将HTTP GET/POST请求发送到目标服务器。当应用程序尝试建立到安全服务器(https)的连接时,问题就会出现。为此,我使用了HttpsURLConnection,如下所示:

url = new URL("https://www.sendspace.com/");
String input, htmlResponse = "";
HttpsURLConnection con;

con = (HttpsURLConnection)url.openConnection();
BufferedReader br = new BufferedReader(new InputStreamReader(con.getInputStream()));

while ((input = br.readLine()) != null){
    htmlResponse += input;
}
br.close();
但是,它显示了以下错误:

javax.net.ssl.SSLHandshakeException:收到致命警报: 握手失败

因此,我将上述代码更改为:

url = new URL("https://www.sendspace.com/");
String input, htmlResponse = "";

SSLUtilities.trustAllHostnames();
SSLUtilities.trustAllHttpsCertificates();
HttpsURLConnection con;
// code below has not been changed
用过的。 然而,我注意到这样做没有任何效果,因为我仍然收到完全相同的错误,再次:

javax.net.ssl.SSLHandshakeException:收到致命警报: 握手失败

同样,我也尝试使用不同的方法,包括在启动HttpsURLConnection之前使用这一行:

SSLCertificateValidation.disable();
即使使用它也会返回与前面解释的完全相同的错误。我想确切地知道为什么这种方法不起作用,我怎样才能避免这个错误

请注意以下事项:

  • 不言而喻,我已经在这个问题上进行了广泛的搜索,并且已经花费了大量的时间,尝试了不同的建议和代码示例,但是没有结果。我知道这个错误在很多问题中都会出现,但我没有找到一个与我自己的问题相关的具体答案

  • 我知道并理解由于禁用证书验证而产生的安全问题。但是,由于此应用程序将连接到100到200个不同的服务器(根据需要),因此在每个服务器的基础上管理证书是不可行的。因此,除非有人能够说明(a)检索、(b)存储和(c)在每台服务器上(在运行时)使用正确证书的方法,否则所有这些都必须以编程方式完成,而无需任何手动工作,这表明“干净”的方法并不是此场景的解决方案


  • 谢谢。

    握手失败不是证书验证错误,因此您无法通过忽略证书错误来修复它(这是一个坏主意)。SSLLabs页面更清楚地说明了问题的真正原因:

    Java 8u31   Protocol or cipher suite mismatch   
    
    如果查看服务器支持的密码(同样在SSLLabs报告中),您可以看到所有密码都包含密钥大小为256的AES。但是,在中指出,由于导出限制,AES支持的最大密钥大小为128。这意味着您的客户端只提供AES128密码,而服务器只接受AES256密码,即没有共享密码

    要解决此问题,您必须按照参考文档中的说明进行操作:

    如果需要更强的算法(例如,具有256位密钥的AES),则必须获取并安装在JDK/JRE中


    在上面的例子()中,我试图研究我试图连接到的服务器的证书,因此我发现:这清楚地说明了所有Java版本中握手的问题。但这仍然不能解释为什么禁用验证的尝试不起作用。你引用的代码似乎至少有11年的历史,质量可疑。
    com.sun.ssl.*
    类从1.4开始就没有与ssl一起使用过。@EJP:我相信您指的是sslutities.java中的代码,那么我使用的第二种方法呢?它应该不起作用吗?此外,你能告诉我一个适合我的方法吗?谢谢,谢谢。尽管我事先就知道SSLLabs页面,但我没有想到键长度的差异。但是,我想在上面的答案中添加一些解决方案,以帮助那些不希望手动将JCE文件添加到JDK/JRE的人。有关完整的描述,请检查以下答案:谢谢。我将平台从1.7改为1.8,现在一切正常。