wake-up-neo.net

Warum erhalte ich eine Ausnahme: javax.net.ssl.SSLPeerUnverifiedException: Peer nicht authentifiziert?

Ich benutze Apache HttpComponents HttpClient (4.0.1), um einen HTTPS-Aufruf durchzuführen, aber ich bin diese Ausnahme als Antwort:

 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)

Ich habe alle erforderlichen Parameter bereitgestellt. Das Zielsystem erfordert keinen Benutzernamen/Kennwort oder Proxy, es enthält jedoch JKS-Zertifikate, die auf dem Server installiert sind. Der Benutzername und die Passwörter sind leere Werte. 

Dies funktioniert mit org.Apache.commons.httpclient.methods.PostMethod - Version 3.0 - commons-httpclient-3.0.jar Nun haben wir mit org.Apache.http.client.methods.HttpPost - Version 4.0.1 - commons-httpclient.jar implementiert

Dies ist der Beispielcode, der nicht funktioniert:

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

Die Ausnahmemeldung 

javax.net.ssl.SSLPeerUnverifiedException: Peer nicht authentifiziert

gibt nicht immer die Hauptursache des Problems an. Möglicherweise müssen Sie den SSL-Handshake-Debug aktivieren, indem Sie den Parameter Java VM -Djavax.net.debug=ssl:handshake hinzufügen. Wenn Sie hinzugefügt haben, dass weitere hilfreiche Fehlermeldungen angezeigt werden ... Wenn der Remote-Server ein Zertifikat verwendet, das nicht vertrauenswürdig ist, wird die folgende Fehlermeldung angezeigt:

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

Wenn dies der Fall ist, löst die Antwort von @Abhishek das Problem.

25
Binu George

wie oben erwähnt, importieren Sie entweder das Zertifikat 

  1. Startbefehl Eingabeaufforderung in dem Verzeichnis, in dem Sie das Zertifikat abgelegt haben (z. B. XYZ.cer) 
  2. Führen Sie den folgenden Befehl aus, ändern Sie einfach den aktiven Pfad (und beachten Sie das Symbol ~).
  3. keytool -import -alias XYZ -Datei XYZ.cer -keystore C: /Program~1/Java/jdk1.6.0_23/jre/lib/security/cacerts -storepassstore

                               OR
    

verwenden Sie Ihren eigenen Vertrauensmanager http://tech.chitgoks.com/2011/04/24/how-to-avoid-javax-net-ssl-sslpeerunverifiedexception-peer-not-authenticated-problem-using- Apache-httpclient/

5

Ein SSL-Verbindungsproblem kann zu diesem Fehler führen.

Eine meiner Lösungen ist das Upgrade von Java auf 6 auf 8. Unser Problem ist, dass der Server, den wir kommunizieren sollen, keine TLS 1.0-Unterstützung mehr hat. Java 6 unterstützt keine höhere Version von TLS 1.0. Nach dem Update von Java (auch ohne Upgrade Dropwizard) funktioniert es.

1
Yu Zhu

Stellen Sie sicher, dass die Server-URL anstelle von http https verwenden soll. Sie können diesen Fehler erhalten, wenn Sie versuchen, eine sichere Verbindung zu einer http-URL herzustellen. 

0