1. Nimm jetzt an unserem Uhans - 3. ADVENT - Gewinnspiel teil - Alle Informationen findest Du hier!

HTTPS-Problem

Dieses Thema im Forum "Android App Entwicklung" wurde erstellt von aychiquita, 07.10.2010.

  1. aychiquita, 07.10.2010 #1
    aychiquita

    aychiquita Threadstarter Neuer Benutzer

    Beiträge:
    1
    Erhaltene Danke:
    0
    Registriert seit:
    07.10.2010
    Hallo allerseits,

    seit einiger Zeit habe ich jetzt schon ein Problem, das ich nicht lösen kann.

    Ich habe eine Methode getJSONObject (siehe unten), die - gegeben der URL wie in der Parameterliste - das angefragte JSON Objekt returnt. Ich verbinde mich dabei mit einer API, was aber nicht so wichtig ist, denn der Fehler wird nicht dort liegen (Ich habe es viele Male getestet, die API antwortet fehlerfrei).

    Das Problem, das ich habe, ist das folgende:
    Immer wenn ich die Methode das erste Mal benutze, funktioniert alles einwandfrei. Sogar innerhalb einer bestimmten Zeitspanne arbeitet es weiterhin fehlerfrei. Wenn ich also getJSONObject ein zweites / drittes / ... Mal aufrufe, funktioniert die Methode immer noch. ABER: Wenn ich z.B. eine Minute warte und dann getJSONObject ausführe, kann keine Verbindung mehr hergestellt werden. Über getResponseCode() bekomme ich "-1". Und noch seltsamer: Falls ich danach noch einmal getJSONObject ausführe, funktioniert es wieder.

    Ich hoffe, ich habe das Problem gut genug beschrieben - Und hoffe natürlich, dass mir hier vllt. jemand helfen kann. Es würde mir sehr helfen!

    Danke für Eure Zeit!

    Code:
       public static JSONObject getJSONObject(String url)
       {
          try
          {
             SSLContext sslContext = SSLContext.getInstance("TLS");
             sslContext.init(null, new TrustManager[] { new MyTrustManager() }, new SecureRandom());
             
             HttpsURLConnection.setDefaultSSLSocketFactory(sslContext.getSocketFactory());
             HttpsURLConnection.setDefaultHostnameVerifier(new MyHostnameVerifier());
             HttpsURLConnection httpsUrlConnection = (HttpsURLConnection) new URL(url).openConnection();
             httpsUrlConnection.setRequestMethod("GET");
             httpsUrlConnection.addRequestProperty(ApiData.getHeader1(), ApiData.getHeader1Value());
             httpsUrlConnection.setDoOutput(true);
             httpsUrlConnection.setDoInput(true);
             httpsUrlConnection.connect();
             
             BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(httpsUrlConnection.getInputStream()));
             
             StringBuffer stringBuffer = new StringBuffer();
             
             String readLine;
             
             while((readLine = bufferedReader.readLine()) != null)
             {
                stringBuffer.append(readLine);
             }
             
             bufferedReader.close();
             
             httpsUrlConnection.disconnect();
             
             return new JSONObject(stringBuffer.toString());
          }
          catch(Exception e)
          {
             e.printStackTrace();
          }
          
          return null;
       }
     
  2. Tom299, 27.09.2011 #2
    Tom299

    Tom299 Android-Experte

    Beiträge:
    602
    Erhaltene Danke:
    120
    Registriert seit:
    31.08.2011
    Hallo,

    ich muß eine HTTPS-Connection zu einem Server aufbauen und die Antwort verarbeiten. Dazu hab ich erst mal Google benutzt, um mir einige Code-Beispiele anzusehen.

    Folgendes, sehr simpe Code-Beispiel, habe ich dann verwendet (die url ist natürlich hier ausgetauscht):
    Code:
                    URL url;
                    try {
                        url = new URL("https://test.data.com");
                        HttpsURLConnection sslConnection = (HttpsURLConnection)url.openConnection();
                        System.out.println(sslConnection.getResponseMessage());
                        
                        String readLine;
                        BufferedReader buffReader = new BufferedReader (new InputStreamReader (sslConnection.getInputStream()));
                        
                        int counter = 0;
                        
                        //while (true) {
                        while (counter < 6) {
                            readLine = buffReader.readLine ();
                            if (readLine == null) {
                                sslConnection.disconnect();
                                return;
                            }
                            else {
                                counter++;
                                System.out.println(readLine);
                            }
                        }
                        sslConnection.disconnect();
                    }
                    catch (MalformedURLException e) {
                        e.printStackTrace();
                    }
                    catch (IOException ioe) {
                        ioe.printStackTrace();
                    }
    
    Ich habe nun das Problem, daß die Verbindung mal funktioniert und mal nicht. Anfangs sah es so aus, als würde die 1. 3. 5. usw. Verbindung klappen und die 2. 4. 6. usw. nicht. Habe dann
    Code:
    sslConnection.disconnect()
    explizit eingebaut.
    Danach hatte es zumindest den Anschein, als würde es klappen, da es 3 oder 4 mal in Folge geklappt hat. Danach kam aber wieder der Fehler:
    Code:
    javax.net.ssl.SSLException: Not trusted server certificate
    .
    .
    Caused by: java.security.cert.CertificateException: java.security.cert.CertPathValidatorException: TrustAnchor for CertPath not found.
    
    .
    .
    Caused by: java.security.cert.CertPathValidatorException: TrustAnchor for CertPath not found.
    
    Hat jemand eine Idee, warum es mal funktioniert und mal nicht? Für mich ist es schon wichtig, daß die Verbindung zuverlässig funktioniert und nicht nur per Zufall ...
     
  3. Kranki, 27.09.2011 #3
    Kranki

    Kranki Ehrenmitglied

    Beiträge:
    3,831
    Erhaltene Danke:
    814
    Registriert seit:
    19.07.2009
    Tablet:
    Samsung Galaxy Tab 3 7.0 Lite
  4. Tom299, 27.09.2011 #4
    Tom299

    Tom299 Android-Experte

    Beiträge:
    602
    Erhaltene Danke:
    120
    Registriert seit:
    31.08.2011
    Danke für die Links, aber die kannte ich schon ;-)

    Leider gehts da fast immer nur um self-signed SSL certificates. Wir haben aber ein Zertifikat von Verisign. Ich kenn mich damit zwar nicht wirklich aus, aber ich nehme mal an, daß es dann nicht self-signed ist. Und ein KeyStore-File hab ich auch nicht und wüßte auch nicht, wo ich sowas finde ;-)

    Witzig ist halt, daß mein Arbeitskollege (er hat damals die Anwendung für Windows Mobile gemacht, ich portiere jetzt auf Android) genau die gleichen Probleme hat(te), mal ging es, mal nicht. Er hat einfach mehrmals die Connection versucht bis es ging. Aber mir gefällt die Lösung nicht, da es dann zu sehr auf Zufall beruht.

    Ich hab auch schon mal das TimeOut hochgesetzt, aber damit hat es auch nichts zu tun. Entweder kommt die Fehlermeldung sofort oder es funktioniert.

    Ist es möglich, daß der WebServer nen Tick hat oder so?
     
  5. Tom299, 27.09.2011 #5
    Tom299

    Tom299 Android-Experte

    Beiträge:
    602
    Erhaltene Danke:
    120
    Registriert seit:
    31.08.2011
    Sieht so aus, als wäre dieser "Bug" nur bei Android < 2.3 vorhanden.

    Ich entwickele soweit es geht meistens auf 1.6 oder 2.1, und da ist mir dieser Bug sowohl mit dem Test-Handy als auch mit dem AVD begegnet.

    Jetzt hab ich spaßeshalber mal mein HTC Sensation mit der App getestet und siehe da, 20 mal in Folge eine Verbindung, nicht 1 Fehler. Hab dann mal ne AVD mit 2.3.1 erstellt und auch hier klappt die Verbindung ohne Fehler.

    Kann das evtl. jemand bestätigen? ;-)
     
  6. Monty1979, 06.01.2012 #6
    Monty1979

    Monty1979 Android-Hilfe.de Mitglied

    Beiträge:
    49
    Erhaltene Danke:
    10
    Registriert seit:
    28.09.2011
    ich kann das bestätigen definitiv ein Bug vor 2.3. :cursing:

    Habe jetzt auf mehreren Geräten und AVD‘s getestet und einige User haben sich bei mir wegen diesem Problem ebenfalls gemeldet.
     
  7. Monty1979, 06.01.2012 #7
    Monty1979

    Monty1979 Android-Hilfe.de Mitglied

    Beiträge:
    49
    Erhaltene Danke:
    10
    Registriert seit:
    28.09.2011
    und hier die Lösung
    Code:
    [B][COLOR=#7f0055][FONT=Verdana]if[/FONT][/COLOR][/B][COLOR=black][FONT=Verdana] ( android.os.Build.VERSION.[/FONT][/COLOR][I][COLOR=#0000c0][FONT=Verdana]SDK_INT[/FONT][/COLOR][/I][COLOR=black][FONT=Verdana] < 9) {[/FONT][/COLOR]
    [COLOR=black][FONT=Verdana]System.[I]setProperty[/I]([/FONT][/COLOR][COLOR=#2a00ff][FONT=Verdana]"http.keepAlive"[/FONT][/COLOR][COLOR=black][FONT=Verdana], [/FONT][/COLOR][COLOR=#2a00ff][FONT=Verdana]"false"[/FONT][/COLOR][COLOR=black][FONT=Verdana]);[/FONT][/COLOR]
    [COLOR=black][FONT=Verdana]}[/FONT][/COLOR]
    gefunden habe ich sie auf http://www.go-android.de/externe-news/androids-http-clients allerdings steht auf der Seite bis Froyo(8)
     
    Tom299 bedankt sich.

Diese Seite empfehlen