向https endint发出的卷曲请求正常运行,但Java客户端请求失败,错误为'javax.net.ssl.SSLHandshakeException'

时间:2019-05-20 02:11:36

标签: java ssl curl certificate postman

我试图通过使用Java客户端发出GET请求来连接到https端点。端点就像这样的'https://domain/path/ {token}',但是每次执行请求时,都会得到'javax.net.ssl.SSLHandshakeException:收到致命警报:handshake_failure'异常,我搜寻了很多网站,但没有运气。有趣的是,当我从其他主机(Windows)通过POSTMAN发出相同的请求时,它也复制了从POSTMAN生成的curl命令,并在运行客户端的HOST上运行,在这里也可以正常工作。只有Java代码无法连接到端点。 现在我的问题是:
--->这是证书问题吗?
--->如果是这样,卷曲如何工作而无需证书。

谢谢。

注意:以下是已经尝试过的方法:
->为Java客户端连接设置curl命令提供的同一组HEADERS。
->还使用了替代的rest客户端(okhttp3)和HttpClient库,但是得到了相同的异常。

请在下面找到有效的curl命令:

curl -X GET \
  https://domain/x/y/XUwDummyTokenRKZ80EnxDCJlM \
  -H 'Accept: */*' \
  -H 'Cache-Control: no-cache' \
  -H 'Connection: keep-alive' \
  -H 'Host:hostname' \
  -H 'accept-encoding: gzip, deflate' \
  -H 'cache-control: no-cache

还有用于连接到https端点的java客户端代码:

 public void printGetResult( String destUrlStr ) {
        try {
           URL url = new URL(destUrlStr);
           HttpsURLConnection conn = (HttpsURLConnection)url.openConnection();
           conn.setRequestMethod( "GET" );

           InputStream is = conn.getInputStream();
           InputStreamReader isr = new InputStreamReader(is);
           BufferedReader br = new BufferedReader(isr);

           String inputLine;

           while ((inputLine = br.readLine()) != null) {
               System.out.println(inputLine);
           }

           br.close();


     }catch(Exception e) {
        System.out.println("exception is"+e); 
     }

    }

预期结果:json
(我知道在我的curl请求中我已将accept设置为*,但是它可以工作)
实际结果:

javax.net.ssl.SSLHandshakeException:收到致命警报:handshake_failure

1 个答案:

答案 0 :(得分:0)

您必须将远程服务器证书添加到java's Truststore。 有几种方法可以做到这一点。 Here是一个例子。