【发布时间】:2015-11-14 08:19:03
【问题描述】:
我正在编写一些将 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
它使用了SSLUtilities.java。 但是,我注意到这样做没有任何效果,因为我仍然再次收到完全相同的错误:
javax.net.ssl.SSLHandshakeException:收到致命警报: 握手失败
同样,我也尝试使用不同的方法,包括在启动 HttpsURLConnection 之前使用此行来使用 SSLCertificateValidation.java:
SSLCertificateValidation.disable();
甚至使用它返回与前面解释的完全相同的错误。我想确切地知道为什么这种方法不起作用,我怎么可能绕过这个错误?
请注意以下几点:
不用说,我已经对这个问题进行了广泛的搜索,并且已经花费了大量时间,尝试了不同的建议和代码示例,但无济于事。我知道这个错误已经在很多问题中出现,但我没有找到与我自己相关的已经存在的具体答案。
我知道并理解由于禁用证书验证而出现的安全问题。但是,由于此应用程序将连接到 100 到 200 个不同的服务器(根据需要),因此在每个服务器的基础上管理证书是不可行的。因此,除非有人可以说明(a)检索、(b)存储和(c)在每个服务器的基础上(在运行时)使用正确证书的方法,所有这些都必须以编程方式完成,无需任何手动工作,建议“干净”的方式来做这件事并不是解决这种情况的方法。
谢谢。
【问题讨论】:
-
我试图调查我试图连接的服务器的证书,在上面的例子中(sendspace.com),因此我发现了这个:ssllabs.com/ssltest/analyze.html?d=sendspace.com,它清楚地说明了一个问题在所有带有握手的 Java 版本中。但这仍然不能解释为什么验证禁用尝试不起作用。
-
您引用的代码似乎至少有 11 年的历史并且质量可疑。自 1.4 以来,
com.sun.ssl.*类未与 SSL 一起使用。 -
@EJP:我相信你指的是SSLUtilities.java中的代码,我使用的第二种方法呢?它不应该工作吗?此外,您能否指导我采用一种适合我的目的的方法?谢谢。
标签: java ssl httpsurlconnection sslhandshakeexception