it-swarm.com.ru

Почему я получаю исключение javax.net.ssl.SSLPeerUnverifiedException: узел не аутентифицирован?

Я использую 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();
}
25
Sravan

Сообщение об исключении 

javax.net.ssl.SSLPeerUnverifiedException: узел не аутентифицирован

не всегда указывает на причину проблемы. Может потребоваться включить отладку рукопожатия SSL, добавив параметр Java VM -Djavax.net.debug=ssl:handshake. Как только вы добавите, что вы получите больше полезных сообщений об ошибках . Если удаленный сервер использует сертификат, который не является доверенным, вы увидите следующее сообщение об ошибке:

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 решит проблему.

25
Binu George

как упоминалось выше, либо вы импортируете сертификат 

  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/

5
Abhishek Gayakwad

Любая проблема с соединением SSL может привести к этой ошибке.

Одно из моих решений - обновить Java с 6 до 8. Наша проблема в том, что сервер, с которым мы собирались общаться, перестал поддерживать TLS 1.0. И Java 6 не поддерживает верхнюю версию TLS 1.0. После обновления Java (даже без обновления dropwizard) все работает.

1
Yu Zhu

Убедитесь, что URL-адрес сервера должен использовать https вместо http. Вы можете получить эту ошибку, пытаясь установить безопасное соединение с http URL. 

0
thebiggestlebowski