2016-11-12 214 views
-1

這是一個有關在我的代碼中發生的異常的問題,該問題會調用https服務器。javax.net.ssl.SSLPeerUnverifiedException:對方未驗證錯誤

javax.net.ssl.SSLPeerUnverifiedException: peer not authenticated 

它在內部使用CloseableHttpClient的一個實例來執行PUT調用。

此外,此代碼是一項功能測試,它將作爲CI作業在遠程計算機上運行。我已經看到了提及我們如何可以禁用Java中的SSL證書驗證或在本地JVM添加證書的SSL證書錯誤的一些解決方案,其中之一就是在這裏 -

'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

如果你的意思是Apache組件(你其實不這麼說)'CloseableHttpClient'是不可構建的;通常你使用'HttpClientBuilder'的結果來定製'SSLContext'包括truststore甚至'TrustManager'。儘管如果你在代碼中這樣做,你至少在某種程度上違反了「測試你釋放的內容」的原則,特別是可能會使得發佈的安全性更低,甚至完全不安全。 –

+0

@melgart我在上面的文章中添加了代碼作爲鏈接。它是[這裏](https://gist.github.com/sarankumarv/b05cba4d86080e84eed693bd6789f25e),作爲Github的要點。 – Saran

回答

-1

正如在問題中提到,代碼工作正常,如果它是在一個獨立的類運行時,通過主要方法。

我能夠通過將我的代碼放在static塊中來解決問題。它可能與課程加載期間被禁用的證書有關,因此現在工作正常。

+0

它肯定沒有任何與'課程加載時禁用的證書'有關的任何事情。 – EJP

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()); 
+0

這是代碼中的內部代碼,但是與POST一樣。在實施中,證書也被禁用。 – Saran

相關問題