簡體   English   中英

為什么我得到一個異常javax.net.ssl.SSLPeerUnverifiedException:peer未經過身份驗證?

[英]Why am I getting an exception javax.net.ssl.SSLPeerUnverifiedException: peer not authenticated?

我正在使用Apache HttpComponents HttpClient(4.0.1)進行HTTPS調用,但我將此異常作為響應:

 javax.net.ssl.SSLPeerUnverifiedException: peer not authenticated
        at com.sun.net.ssl.internal.ssl.SSLSessionImpl.getPeerCertificates(SSLSessionImpl.java:345)
        at org.apache.http.conn.ssl.AbstractVerifier.verify(AbstractVerifier.java:128)
        at org.apache.http.conn.ssl.SSLSocketFactory.connectSocket(SSLSocketFactory.java:390)
        at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:148)
        at org.apache.http.impl.conn.AbstractPoolEntry.open(AbstractPoolEntry.java:149)
        at org.apache.http.impl.conn.AbstractPooledConnAdapter.open(AbstractPooledConnAdapter.java:121)
        at org.apache.http.impl.client.DefaultRequestDirector.tryConnect(DefaultRequestDirector.java:561)
        at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:415)
        at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:820)
        at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:754)
        at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:732)

我提供了所有必需的參數。 目標系統不需要任何用戶名/密碼或代理,但它包含安裝在服務器中的JKS證書。 用戶名和密碼是空值。

這與org.apache.commons.httpclient.methods.PostMethod一起使用 - 版本3.0 - commons-httpclient-3.0.jar現在我們已經用org.apache.http.client.methods.HttpPost實現了 - 版本4.0.1 - commons- httpclient.jar

這是不起作用的示例代碼段:

HttpParams param = new BasicHttpParams();
HttpProtocolParams.setVersion(param, HttpVersion.HTTP_1_1);
HttpProtocolParams.setContentCharset(param, "UTF-8");
HttpProtocolParams.setUseExpectContinue(param, true);
DefaultHttpClient httpClient = new DefaultHttpClient(param);
httpClient.getParams().setParameter(HttpConnectionParams.CONNECTION_TIMEOUT,10000)));
httpClient.getParams().setParameter(HttpConnectionParams.SO_TIMEOUT,10000)));
httpClient.getCredentialsProvider().setCredentials(new AuthScope(<HOST IP,PORT)),
    AuthScope.ANY_REALM),
    new UsernamePasswordCredentials("", ""));

try {
HttpPost httpPost = new HttpPost(END POINT URL);
StringEntity requestEntity = new StringEntity(inputString, "text/xml", "UTF-8");
httpPost.setEntity(requestEntity);
response = httpClient.execute(httpPost);
HttpEntity responseEntity = response.getEntity();
if (null != responseEntity) 
{
    responseBody = EntityUtils.toString(responseEntity);
}
if (null != httpPost.getURI()) {
    url = httpPost.getURI().toString();
}
} catch (IOException e) {
    e.printStackTrace();
} finally {
   httpClient.getConnectionManager().shutdown();
}

異常消息

javax.net.ssl.SSLPeerUnverifiedException:peer未經過身份驗證

並不總是表明問題的根本原因。 您可能需要通過添加Java VM參數-Djavax.net.debug=ssl:handshake來啟用SSL握手調試。 添加完成后,您將收到更多有用的錯誤消息。 如果遠程服務器使用不受信任的證書,您將看到以下錯誤消息:

javax.net.ssl.SSLHandshakeException:
sun.security.validator.ValidatorException: PKIX path building failed:
sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target

如果是這種情況,那么@Abhishek的答案將解決問題。

如上所述,您要么導入證書

  1. 在已放置證書的目錄中啟動命令提示符(例如XYZ.cer)
  2. 運行以下命令只需更改活動的jre路徑(請注意〜符號)
  3. keytool -import -alias XYZ -file XYZ.cer -keystore C:/Program~1/Java/jdk1.6.0_23/jre/lib/security/cacerts-storepass changeit

      OR 

使用您自己的信托經理http://tech.chitgoks.com/2011/04/24/how-to-avoid-javax-net-ssl-sslpeerunverifiedexception-peer-not-authenticated-problem-using-apache-httpclient/

任何SSL連接問題都可能導致此錯誤。

我的一個解決方案是將java從6升級到8.我們的問題是我們打算通信的服務器是停止支持TLS 1.0。 而java 6不支持TLS 1.0的上層版本。 更新Java(即使沒有升級dropwizard)它的工作原理。

確保服務器URL應該使用https而不是http。 嘗試建立與http URL的安全連接時,您可能會收到此錯誤。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM