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

Schreibe einen Kommentar