Sicheres Reparieren: javax.net.ssl.SSLPeerUnverifiedException: Kein Peer-Zertifikat
Gibt es Dutzende von Beiträgen zu diesem Thema (javax.net.ssl.SSLPeerUnverifiedException: No peer certificate), aber ich habe nicht nichts gefunden, das funktioniert für mich.
Viele Beiträge (wie dieseund diese) "lösen" das, indem alle Zertifikate akzeptiert zu werden, aber natürlich ist dies nicht eine gute Lösung für etwas anderes als testen.
Andere scheinen ziemlich lokalisiert und arbeiten nicht für mich. Ich hoffe wirklich, dass jemand hat einige Einsichten, die mir fehlen.
So, mein problem: ich Teste auf einem server zugänglich nur über das lokale Netz, die Verbindung über HTTPS. Den Aufruf muss ich über den browser funktioniert einwandfrei. Keine Klagen über Zertifikate und überprüfen Sie die Zertifikate, es sieht alles gut aus.
Wenn ich versuche auf meinem Android-Gerät, bekomme ich javax.net.ssl.SSLPeerUnverifiedException: No peer certificate
Hier ist der code, es ruft:
StringBuilder builder = new StringBuilder();
builder.append( /* stuff goes here*/ );
httpGet.setEntity(new UrlEncodedFormEntity(nameValuePairs));
ResponseHandler<String> responseHandler = new BasicResponseHandler();
//Execute HTTP Post Request. Response body returned as a string
HttpClient httpClient = MyActivity.getHttpClient();
HttpGet httpGet = new HttpGet(builder.toString());
String jsonResponse = httpClient.execute(httpGet, responseHandler); //Line causing the Exception
Mein code für MyActivity.getHttpClient()
:
protected synchronized static HttpClient getHttpClient(){
if (httpClient != null)
return httpClient;
HttpParams httpParameters = new BasicHttpParams();
HttpConnectionParams.setConnectionTimeout(httpParameters, TIMEOUT_CONNECTION);
HttpConnectionParams.setSoTimeout(httpParameters, TIMEOUT_SOCKET);
HttpProtocolParams.setVersion(httpParameters, HttpVersion.HTTP_1_1);
//Thread safe in case various AsyncTasks try to access it concurrently
SchemeRegistry schemeRegistry = new SchemeRegistry();
schemeRegistry.register(new Scheme("http", PlainSocketFactory.getSocketFactory(), 80));
schemeRegistry.register(new Scheme("https", SSLSocketFactory.getSocketFactory(), 443));
ClientConnectionManager cm = new ThreadSafeClientConnManager(httpParameters, schemeRegistry);
httpClient = new DefaultHttpClient(cm, httpParameters);
CookieStore cookieStore = httpClient.getCookieStore();
HttpContext localContext = new BasicHttpContext();
localContext.setAttribute(ClientContext.COOKIE_STORE, cookieStore);
return httpClient;
}
Jede Hilfe wäre sehr geschätzt werden.
Bearbeiten
Auch nur zu erwähnen, ich habe andere SSL-Probleme mit einer anderen app aber das hinzufügen der SchemeRegistry
Teil fixiert es für mich vor.
Edit 2
Bisher hab ich nur getestet auf Android 3.1, aber ich brauche dies funktioniert auf Android 2.2+ - unabhängig. Ich habe gerade getestet über den browser auf meinem Android-tab (Android 3.1) und es beschwert sich über das Zertifikat. Es ist in Ordnung auf meinem pc-browser, aber nicht auf der Android-browser oder in mein app.
Edit 3
Stellt sich heraus, das iOS-browser auch beschwert sich darüber. Ich fange an zu denken, es ist eine Zertifikat-Kette beschriebene Problem hier (SSL-Zertifikat ist nicht vertrauenswürdig - mobile nur)
InformationsquelleAutor der Frage Mike T | 2013-08-08
Du musst angemeldet sein, um einen Kommentar abzugeben.
Es stellt sich heraus, mein code war in Ordnung und das problem war, dass der server nicht wieder die komplette Zertifikatskette. Für mehr Informationen, sehen Sie diese SO ein post und dieser die superuser-post:
SSL-Zertifikat ist nicht vertrauenswürdig - mobile nur
https://superuser.com/questions/347588/how-do-ssl-chains-work
InformationsquelleAutor der Antwort Mike T
Versuchen folgenden code :-
InformationsquelleAutor der Antwort Yogesh Tatwal
In meinem Fall alles gut funktioniert. Plötzlich nach 2 Tagen mein Gerät zeigte keine https-Seite oder Bild-link.
Nach einigen Untersuchungen stellt sich heraus, dass Meine Zeit-Einstellungen war nicht up-to-date-Gerät.
Änderte ich meine Zeit, die Einstellungen richtig und es funktionierte.
InformationsquelleAutor der Antwort user2536147
Hatte ich diese Ausnahme, wenn ich selbst-signiertes Zertifikat + ip-Adresse. Nur fügen Sie diese Zeilen
und Ihre HttpURLConnection arbeiten.
Dass trick ist, nicht in Zusammenhang mit Validierung gegen CA! Also, wenn ich angeben falsche CA und verwenden diesen trick, bekomme ich eine andere exception. Also der host bleibt vertrauenswürdigen
Nur für den Fall, überlasse ich code zur Angabe Ihres eigenen CA-hier:
Vergessen Sie nicht, cooles feature buildTypes und verschiedene Zertifizierungsstellen für debug/release in den res-Ordner.
InformationsquelleAutor der Antwort Viktor