2016-02-17 4 views
21

In einer meiner Anwendungen verwende ich HTTPS mit einem selbstsignierten Zertifikat und folgte dem Beispielcode von der Android-Entwickler-Trainings-Website (https://developer.android.com/training/articles/security-ssl.html#UnknownCa).Google Play Sicherheitswarnung für unsicheren TrustManager

Ich habe vor kurzem die folgende Warnung sagen, dass die aktuelle Implementierung ist nicht gesichert:

Sicherheitsalarm

Ihre App eine unsichere Implementierung der X509TrustManager Schnittstelle mit einem Apache-HTTP-Client verwendet Dies führt zu einer Sicherheitslücke. Einzelheiten finden Sie unter this Google Help Center article, einschließlich der Frist für die Behebung der Sicherheitslücke.

Kann jemand mehr Details darüber angeben, was über den oben verlinkten Beispielcode hinaus aktualisiert werden sollte?

Sollte ich eine benutzerdefinierte TrustManager implementieren? Wenn ja, was sollte es verifizieren?

+1

Ähm, das in [Google-Hilfeartikel] (https://support.google.com/faqs/answer/6346016) bedeckt zu sein scheint: SSL „Um richtig zu behandeln Überprüfen Sie in der checkServerTrusted-Methode Ihrer benutzerdefinierten X509TrustManager-Schnittstelle den Code, um entweder CertificateException oder IllegalArgumentException auszulösen, wenn das vom Server vorgelegte Zertifikat Ihren Erwartungen nicht entspricht. " Wie genau richten Sie Ihren TrustManager ein? Wie benutzt du es? – CommonsWare

+0

@CommonsWare genau wie im Beispielcode https://developer.android.com/training/articles/security-ssl.html#UnknownCa Sollte ich etwas anderes tun? – Muzikant

+0

Es gibt keinen Code für das selbstsignierte Serverzertifikatszenario auf der Seite, mit der Sie verknüpft sind. Es gibt Code für das Szenario mit unbekannten Zertifizierungsstellen. – CommonsWare

Antwort

3

Für mich war das Problem Mobilecore. Ich habe die Bibliothek aus der App entfernt und eine neue Version der Apk hochgeladen und die Warnung ist von der GPlay Dev-Konsole verschwunden.

14

Versuchen Sie in Ihren Codes nach "TrustManager" zu suchen, wenn keiner gefunden werden kann, meistens aufgrund von Drittanbieterbibliotheken.

Für mich war es wegen der Verwendung einer älteren Version von ACRA (https://github.com/ACRA/acra).

+0

Wie in den Kommentaren zu der Frage erwähnt, war dies ein ähnlicher Fall mit einer anderen 3rd-Party-Bibliothek – Muzikant

+1

Gibt es eine Möglichkeit, wie wir dieses Problem während der Kompilierung wie mit Lint oder einem statischen Analyse-Tool zu fangen . – Pavan

+0

Bezüglich ACRA, siehe https://github.com/ACRA/acra/issues/374 – mhsmith

1

Ich habe auch festgestellt, dass ARCA 4.3 möglicherweise der Übeltäter für meine App ist.

Frage, weiß jemand zu überprüfen, dass das Problem gelöst ist? Momentan verursacht der Google Play Store, auf den ich Zugriff habe, nicht die Warnung von Google, aber einer unserer Partner, der die App veröffentlicht hat, hat die Warnung erhalten. Ich möchte überprüfen, ob das Problem gelöst wurde, bevor wir unserem Partner eine neue APK zur Verfügung stellen.

2

Vielleicht zu spät, aber hoffe, es kann jemand helfen, rufen Sie diese Methode vor Anforderung an den Server. Wenn das Zertifikat nicht vertrauenswürdig ist, haben Sie einen Dialog oder etwas, damit der Benutzer sich entscheiden kann, hier benutze ich den Alarmdialog.

public static void trustSSLCertificate(final Activity mActivity, final DownloadPortalTask task){ 
 
     try { 
 
      HttpsURLConnection.setDefaultHostnameVerifier(new HostnameVerifier() { 
 
       public boolean verify(String hostname, SSLSession session) { 
 
        return true; 
 
       } 
 
      }); 
 

 
      SSLContext context = SSLContext.getInstance("TLS"); 
 
      context.init(null, new X509TrustManager[]{new X509TrustManager() { 
 
       public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException { 
 
       } 
 

 
       public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException { 
 
        try { 
 
         chain[0].checkValidity(); 
 
        } catch (final Exception e) { 
 

 
         mActivity.runOnUiThread(new Runnable() { 
 
          @Override 
 
          public void run() { 
 
           AlertDialog.Builder builder = new AlertDialog.Builder(mActivity); 
 
           AlertDialog alertDialog = builder.create(); 
 
           alertDialog.setCancelable(false); 
 
           String message = "There a problem with the security certificate for this web site."; 
 
           message += "\nDo you want to continue anyway?"; 
 
           alertDialog.setTitle("SSL Certificate Error"); 
 
           alertDialog.setMessage(message); 
 
           alertDialog.setButton(DialogInterface.BUTTON_POSITIVE, "OK", new DialogInterface.OnClickListener() { 
 
            @Override 
 
            public void onClick(DialogInterface dialog, int which) { 
 
             acceptSSL = true; 
 
             return; 
 

 
            } 
 
           }); 
 

 
           alertDialog.setButton(DialogInterface.BUTTON_NEGATIVE, "Cancel", new DialogInterface.OnClickListener() { 
 
            @Override 
 
            public void onClick(DialogInterface dialog, int which) { 
 
             acceptSSL = true; 
 
             task.onInterruptedDownload(); 
 
            } 
 
           }); 
 
           alertDialog.show(); 
 

 
          } 
 

 
         }); 
 

 
         while(!acceptSSL){ 
 
          try{ 
 
           Thread.sleep(1000); 
 
          } catch(InterruptedException er) { } 
 
         } 
 

 
        } 
 
       } 
 
       public X509Certificate[] getAcceptedIssuers() { 
 
        return new X509Certificate[0]; 
 
       } 
 
      }}, new SecureRandom()); 
 
      HttpsURLConnection.setDefaultSSLSocketFactory(context.getSocketFactory()); 
 
     } catch (Exception e) { // should never happen 
 
      e.printStackTrace(); 
 
     } 
 
    }