HttpsURLConnection的已禁用证书验证仍在获取javax.net.ssl.SSLHandshakeException:收到致命警报:握手失败
我正在编写一些代码,将HTTP GET/POST请求发送到目标服务器。当应用程序尝试建立到安全服务器(https)的连接时,问题就会出现。为此,我使用了HttpsURLConnection,如下所示: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()
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();
即使使用它也会返回与前面解释的完全相同的错误。我想确切地知道为什么这种方法不起作用,我怎样才能避免这个错误
请注意以下事项:
谢谢。握手失败不是证书验证错误,因此您无法通过忽略证书错误来修复它(这是一个坏主意)。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,现在一切正常。