这是一个关于我的代码中发生的异常的问题,该异常调用了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。
如果您需要更多详细信息,请与我们联系。
答案 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
块中来解决问题。它可能与在类加载期间被禁用的证书有关,因此,现在工作正常。