web-dev-qa-db-fra.com

Pourquoi ai-je une exception javax.net.ssl.SSLPeerUnverifiedException: homologue non authentifié?

J'utilise Apache HttpComponents HttpClient (4.0.1) pour effectuer un appel HTTPS, mais je suis cette exception comme réponse:

 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)

J'ai fourni tous les paramètres requis. Le système de destination ne requiert aucun nom d'utilisateur/mot de passe ni proxy, mais il contient des certificats JKS installés sur le serveur. Le nom d'utilisateur et les mots de passe sont des valeurs vides. 

Cela fonctionne avec org.Apache.commons.httpclient.methods.PostMethod - Version 3.0 - commons-httpclient-3.0.jarMaintenant, nous avons implémenté avec org.Apache.http.client.methods.HttpPost - Version 4.0.1 - commons-httpclient.jar

Voici l'extrait de code qui ne fonctionne pas:

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

Le message d'exception 

javax.net.ssl.SSLPeerUnverifiedException: homologue non authentifié

n'indique pas toujours la cause première du problème. Vous devrez peut-être activer le débogage de prise de contact SSL en ajoutant le paramètre Java VM -Djavax.net.debug=ssl:handshake. Une fois que vous avez ajouté que vous obtiendrez d'autres messages d'erreur utiles Si le serveur distant utilise un certificat non approuvé, le message d'erreur suivant s'affiche:

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

Si tel est le cas, la réponse de @Abhishek résoudra le problème.

25
Binu George

Tout problème de connexion SSL peut entraîner cette erreur.

Une de mes solutions consiste à mettre à niveau Java de 6 à 8. Et Java 6 ne supporte pas la version supérieure de TLS 1.0. Après la mise à jour de Java (même sans mise à niveau de dropwizard), cela fonctionne.

1
Yu Zhu

Assurez-vous que l'URL du serveur est censé utiliser https au lieu de http. Vous pouvez obtenir cette erreur en essayant de configurer une connexion sécurisée avec une URL http. 

0
thebiggestlebowski