javax.net.ssl.SSLPeerUnverifiedException:peer not authenticated error

时间:2016-11-12 04:16:00

标签: java ssl https ssl-certificate

这是一个关于我的代码中发生的异常的问题,该异常调用了https服务器。

javax.net.ssl.SSLPeerUnverifiedException: peer not authenticated

它在内部使用CloseableHttpClient的实例来执行PUT调用。

此外,此代码是一个功能测试,它将作为CI作业在远程计算机上运行。我已经看到一些SSL证书错误的解决方案,它提到我们如何在Java中禁用SSL证书验证或在本地JVM中添加证书,其中一个在这里 -

'peer not authenticated' SSL certificate error usng DefaultHttpClient

不幸的是,它似乎没有工作,因为这是一台远程机器,我们无法将证书导入该机器。

String endPoint = "https://" + hostName + ":" + port + "/v1/service/data/put";

endPoint在从jar调用的代码中设置。因此,我们也无法改变它。

如果我正在运行从独立类(通过main方法)对endPoint进行PUT调用的代码,它似乎运行正常,返回200 / OK。目前,如果从.xml文件作为TestNG类运行,则会发生异常。

作为Github要点添加的代码是here

如果您需要更多详细信息,请与我们联系。

2 个答案:

答案 0 :(得分:0)

那里有很多事情,其中​​大部分都与问题无关(例如缓存,或者设置调用的其他样板代码)。

我通常在这种情况下做的是将问题减少到越来越小的代码块,这些代码仍然可以重现问题。例如,使用这些HttpClient组件,您可以进行任何 SSL调用吗?试试这个代码,它需要HttpClient 4.4,并且可以在没有有效证书的网站上运行:

    CloseableHttpClient client = HttpClients.custom()
      .setSSLContext(sslContext)
      .setSSLHostnameVerifier(new NoopHostnameVerifier())
      .build();
    HttpGet httpGet = new HttpGet(<your https URL here>);
    httpGet.setHeader("Accept", <whatever appropriate for URL above>);

    HttpResponse response = client.execute(httpGet);
    System.out.println(response.getStatusLine().getStatusCode());

答案 1 :(得分:-1)

正如问题中提到的,如果代码通过main方法在独立类中运行,则代码可以正常工作。

我可以将代码放在static块中来解决问题。它可能与在类加载期间被禁用的证书有关,因此,现在工作正常。