我一直在尝试向HTTPS网站发出GET请求。出于测试目的,我将我的代码指向https://httpbin.org/ip,这是我在StackOverflow上的其他地方找到的示例所指示的。我生成了一个密钥库,代码成功加载了该文件,并且正确地(据我所知)创建了CloseableHttpClient。
代码一直执行,直到我在输出窗口中看到“执行请求”消息。然后它挂起60秒(HttpGet的标准超时)并抛出以下错误:
2016年2月24日下午5:01:58 org.apache.http.impl.execchain.RetryExec执行 信息:处理{s}的请求时捕获的I / O异常(java.net.SocketException) - > https://httpbin.org:443:连接重置 2016年2月24日下午5:01:58 org.apache.http.impl.execchain.RetryExec执行 信息:正在重试{s} - > https:httpbin.org:443
的请求
我已经尝试生成一个新的密钥库,以及不同的SSLSocket设置(比如忽略所有证书),但我总是得到同样的错误。我确信我在生成密钥/证书时犯了一个错误,但我似乎无法确定在哪里。完整代码如下。
编辑:我正在使用Netbeans。
// Trust own CA and all self-signed certs
SSLContext sslcontext = SSLContexts.custom()
.loadTrustMaterial(new File("src/keystore.jks"), "password".toCharArray(),
new TrustSelfSignedStrategy())
.build();
// Allow TLSv1 protocol only
SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(
sslcontext,
new String[] { "TLSv1" },
null,
SSLConnectionSocketFactory.getDefaultHostnameVerifier());
CloseableHttpClient httpclient = HttpClients.custom()
.setSSLSocketFactory(sslsf)
.build();
try {
HttpGet httpget = new HttpGet("https://httpbin.org/ip");
System.out.println("Executing request " + httpget.getRequestLine());
CloseableHttpResponse response = httpclient.execute(httpget);
try {
HttpEntity entity = response.getEntity();
System.out.println("----------------------------------------");
System.out.println(response.getStatusLine());
EntityUtils.consume(entity);
} finally {
response.close();
}
} finally {
httpclient.close();
}