Ich habe javax.net.ssl.SSLPeerUnverifiedException: peer nicht authentifizierten auf meinem JUnit-test
Erstelle ich einige unit-tests für Anwendungen, die eine REST-API. Wenn ich versuche zu senden, ein HttpPost-request an die server-URL (https://some.server.com), ich habe diese:
javax.net.ssl.SSLPeerUnverifiedException: peer not authenticated
at com.sun.net.ssl.internal.ssl.SSLSessionImpl.getPeerCertificates(SSLSessionImpl.java:352)
at org.apache.http.conn.ssl.AbstractVerifier.verify(AbstractVerifier.java:128)
at org.apache.http.conn.ssl.SSLSocketFactory.createSocket(SSLSocketFactory.java:399)
at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:143)
at org.apache.http.impl.conn.AbstractPoolEntry.open(AbstractPoolEntry.java:149)
at org.apache.http.impl.conn.AbstractPooledConnAdapter.open(AbstractPooledConnAdapter.java:108)
at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:415)
at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:641)
at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:576)
at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:554)
Dem server verifiziert HTTPS-Zertifikat. Auch, wenn ich auf Produktion, es funktioniert gut. Also ich denke, es hat zu tun mit JUnit und/oder meinem lokalen computer.
Ich bin auch mit einem HttpClient erstellt mit diesem:
public static class WebClientDevWrapper {
public static HttpClient wrapClient(HttpClient base) {
try {
SSLContext ctx = SSLContext.getInstance("TLS");
X509TrustManager tm = new X509TrustManager() {
public void checkClientTrusted(X509Certificate[] xcs, String string) throws CertificateException {
}
public void checkServerTrusted(X509Certificate[] xcs, String string) throws CertificateException {
}
public X509Certificate[] getAcceptedIssuers() {
return null;
}
};
ctx.init(null, new TrustManager[]{tm}, null);
SSLSocketFactory ssf = new SSLSocketFactory(ctx);
ssf.setHostnameVerifier(SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);
ClientConnectionManager ccm = base.getConnectionManager();
SchemeRegistry sr = ccm.getSchemeRegistry();
sr.register(new Scheme("https", ssf, 443));
return new DefaultHttpClient(ccm, base.getParams());
} catch (Exception ex) {
ex.printStackTrace();
return null;
}
}
}
AFAIK, wenn ich einen HTTPClient mit dem code oben, sollte es vermeiden SSLPeerUnverifiedException
, aber es scheint, dass es nicht funktioniert.
Also, wie kann ich dieses problem lösen? Ich habe versucht, mehr Möglichkeiten zu schaffen HttpClients, die sich nicht beschweren über SSL-certs, aber hat nichts geklappt so weit.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Tun Sie zufällig mit Linux? Ich habe verrückte Probleme mit Java und SSL auf einem Ubuntu-system. Das ist mit der Datei /etc/hosts Zuordnung localhost 127.0.1.1 statt 127.0.0.1. Beide sind gleichermaßen gültig nach IANA-mappings, aber Java scheint Perücke aus, wenn es nicht 127.0.0.1. Wenn sich das problem manifestiert, es nur selten macht es sogar vorbei an den handshake, also selbst wenn Sie noch komplett deaktiviert alle cert-Prüfung, es wird immer noch nicht in unerwarteter Weise.
Meisten Antworten auf diese Frage auf StackOverflow und anderswo) verbringen zu viel Zeit mit Schwerpunkt auf der Java-code selbst, und die Antwort, die oft gegeben wird, ist nur zu umgehen SSL-überprüfung, die für alle hosts. Bitte tun Sie dies nur als eine absolute Letzte Ausweg sein, auch wenn es nur eine Entwicklungsumgebung, und es nur tun, die pro Domäne als notwendig, anstatt auf der ganzen Linie. Es ist eine schlechte Praxis, und ich Frage mich, wie oft, die "Entwicklungsumgebung nur" code in die Produktion.
Die Realität ist, dass der Fehler ist völlig richtig, und in manchen Situationen ist es tatsächlich die bessere alternative. Sie bekommen nur diese Fehlermeldung, wenn:
Ersten Punkt hat seinen eigenen Satz von Fragen. Es ist fraglich, warum Sie möchten, um eine Verbindung zu einem host in einem Produktions-Szenario, wenn kein Zertifikat installiert ist, aber die Anwendung ist immer noch dienen-Datenverkehr über HTTPs. Wenn Sie vertrauliche Daten über diese Verbindung dann haben Sie eine ernste Sicherheitslücke. Die einzige Lösung für diesen Punkt zu umgehen Prüfung, das ist wirklich keine Lösung, es sei denn, du bist einfach zu "Crawlen" oder "Schaben" - Inhalte.
Leider, das gleiche gilt für den zweiten Punkt auch. Die einzige Lösung, wenn Sie eine Verbindung zum host über SSL zu umgehen, SSL-überprüfung. Auch hinzufügen des Zertifikats zu Ihrer truststore wird nicht verhindern, dass diese Ausnahme, wenn das Zertifikat abgelaufen ist oder erstellt wurde, mit einer ungültigen CN. Wenn Sie eine andauernde Beziehung mit dem host, dann bitten Sie Sie, wenn Sie das problem beheben können.
Die Lösung für das Dritte und vierte Punkt hängt das Vertrauen, das Sie aufgestellt haben, mit den hosts, zu dem Sie eine Verbindung herstellen wollen, aber ist viel besser als nur unter Umgehung aller SSL-host-überprüfung. Fügen Sie einfach das Zertifikat als Zertifikat einer vertrauenswürdigen Zertifikat (Behörde).
Laden Sie zunächst das Zertifikat mit Ihrem Lieblings-browser. Firefox und Chrome stellen Dienstprogramme herunterladen, um ein Zertifikat für eine domain. Diese Frage und Antworten von SuperUser-einige details. In der Java-JDK, die CA truststore befindet sich bei [JAVA_HOME]/jre/lib/security/cacerts. Verwenden Sie den folgenden-keytool-Befehl fügen Sie das Zertifikat heruntergeladen:
Weitere Informationen und andere keytool-Befehle verwende ich gerne die folgende Seite:
Die Gängigsten Java-Keytool-Keystore-Befehle
Überhaupt nicht. Alle, die unsicher X509TrustManager tut, ist zu akzeptieren, peer-Zertifikat, ob vertrauenswürdig oder nicht, das ist völlig sinnlos. Was Sie sehen, ist, dass der peer noch nicht geschickt ein Zertifikat überhaupt.
X509TrustManager
Methoden und es scheint, Sie werden nie genannt. Stattdessen, wenn ich die Aufrufe, etwa google.com, diese Methoden aufgerufen werdenHier ist die Lösung für meinen Kontext.
Arbeitete ich auf Windows 7 im Unternehmens-Umfeld, was bedeutet, dass ich hatte-proxy.
SOAP-url in der Testumgebung, die war nicht ersichtlich, dass die corporate-proxy.
Sicher sein, dass in
Datei->Einstellungen, die Sie festlegen der Proxy-Einstellungen auf None.
Grüße, Karlo.