Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/385.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ssl/3.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
Java HttpClient在执行GET to https url时引发SSLHandshakeException_Java_Ssl_Https_Httpclient - Fatal编程技术网

Java HttpClient在执行GET to https url时引发SSLHandshakeException

Java HttpClient在执行GET to https url时引发SSLHandshakeException,java,ssl,https,httpclient,Java,Ssl,Https,Httpclient,我正在运行一个小main(在Java8中,版本1.8.0.112)来尝试并执行对“https”url的HTTP请求,我们称之为“原始url”。我使用的是标准CloseableHttpClient,创建方式如下: CloseableHttpClient httpClient = HttpClientBuilder.create() .setConnectionManager(new PoolingHttpClientConnectionManager())

我正在运行一个小main(在Java8中,版本1.8.0.112)来尝试并执行对“https”url的HTTP请求,我们称之为“原始url”。我使用的是标准CloseableHttpClient,创建方式如下:

CloseableHttpClient httpClient = HttpClientBuilder.create()
            .setConnectionManager(new PoolingHttpClientConnectionManager())
            .setDefaultRequestConfig(RequestConfig.DEFAULT)
            .build();
但当我击中:

httpClient.execute(request);
我得到了这个错误:

javax.net.ssl.SSLHandshakeException: Received fatal alert: handshake_failure
(下面是完整的堆栈跟踪)

奇怪的是,当我从同一个java代码中访问不同的“https”URL时,它工作得很好。此外,当我从Chrome或Postman(REST客户端)到达“原始url”时,我成功地到达了它。我还尝试从php代码执行对“原始url”的http调用,效果很好

我在StackOverflow中寻找了许多答案,都试图将HttpClient设置为忽略未知证书,但没有成功。此外,由于我可以通过Chrome/Postman/php代码访问“original_url”站点,所以该站点的证书似乎没有过期

JVM密钥库可能有问题吗?任何帮助都将不胜感激

以下是完整的异常堆栈跟踪:

Exception in thread "main" javax.net.ssl.SSLHandshakeException: Received fatal alert: handshake_failure
at sun.security.ssl.Alerts.getSSLException(Alerts.java:192)
at sun.security.ssl.Alerts.getSSLException(Alerts.java:154)
at sun.security.ssl.SSLSocketImpl.recvAlert(SSLSocketImpl.java:2023)
at sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:1125)
at sun.security.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1375)
at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1403)
at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1387)
at org.apache.http.conn.ssl.SSLConnectionSocketFactory.createLayeredSocket(SSLConnectionSocketFactory.java:394)
at org.apache.http.conn.ssl.SSLConnectionSocketFactory.connectSocket(SSLConnectionSocketFactory.java:353)
at org.apache.http.impl.conn.DefaultHttpClientConnectionOperator.connect(DefaultHttpClientConnectionOperator.java:141)
at org.apache.http.impl.conn.PoolingHttpClientConnectionManager.connect(PoolingHttpClientConnectionManager.java:353)
at org.apache.http.impl.execchain.MainClientExec.establishRoute(MainClientExec.java:380)
at org.apache.http.impl.execchain.MainClientExec.execute(MainClientExec.java:236)
at org.apache.http.impl.execchain.ProtocolExec.execute(ProtocolExec.java:184)
at org.apache.http.impl.execchain.RetryExec.execute(RetryExec.java:88)
at org.apache.http.impl.execchain.RedirectExec.execute(RedirectExec.java:110)
at org.apache.http.impl.client.InternalHttpClient.doExecute(InternalHttpClient.java:184)
at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:82)
at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:107)
at com.taboola.jobs.crawler.geoedge.RestAdapterBuilder.main(RestAdapterBuilder.java:127)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:147)

握手错误可能有很多不同的方面,但几乎与服务器证书验证无关,这意味着禁用验证将无济于事。可能没有共享密码、没有公共协议版本、缺少客户端证书等,但从提供的信息来看这是未知的。如果这是一个可公开访问的站点,我建议将URL添加到您的问题中。添加此
-Djavax.net.debug=ssl
以打印更多信息