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();
}
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.
wie oben erwähnt, importieren Sie entweder das Zertifikat
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/
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.
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.