Почему я получаю исключение javax.net.ssl.SSLPeerUnverifiedException: peer не аутентифицирован?
Я использую 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 csrtificates, которые установлены на сервере. Имя пользователя и пароли являются пустыми значениями.
Это работает с org.apache.commons.httpclient.methods.PostMethod
- Version 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();
}
Ответы
Ответ 1
Сообщение об исключении
javax.net.ssl.SSLPeerUnverifiedException: peer not authenticated
не всегда указывает основную причину проблемы.
Возможно, вам потребуется включить отладку подтверждения 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 решит проблему.
Ответ 2
как указано выше, вы импортируете сертификат
используйте собственный менеджер доверия
http://tech.chitgoks.com/2011/04/24/how-to-avoid-javax-net-ssl-sslpeerunverifiedexception-peer-not-authenticated-problem-using-apache-httpclient/
Ответ 3
Любая ошибка SSL-соединения может привести к этой ошибке.
Одним из моих решений является обновление java от 6 до 8.
Наша проблема заключается в том, что сервер, на котором мы собираемся общаться, не поддерживает TLS 1.0. И java 6 не поддерживает верхнюю версию TLS 1.0. После обновления Java (даже без обновления dropwizard) он работает.
Ответ 4
Убедитесь, что URL-адрес сервера должен использовать https вместо http. Вы можете получить эту ошибку, пытаясь настроить безопасное соединение с URL-адресом http.