web-dev-qa-db-fra.com

Alerte de sécurité Google Play pour TrustManager non sécurisé

Dans l'une de mes applications, j'utilise HTTPS avec un certificat auto-signé et j'ai suivi l'exemple de code du site de formation des développeurs Android ( https://developer.Android.com) /training/articles/security-ssl.html#UnknownCa ).

J'ai récemment reçu l'alerte suivante disant que l'implémentation actuelle n'est pas sécurisée:

Alerte de sécurité

Votre application utilise une implémentation non sécurisée de l'interface X509TrustManager avec un client HTTP Apache, entraînant une vulnérabilité de sécurité. Veuillez consulter cet article du centre d'aide Google pour plus de détails, y compris la date limite de correction de la vulnérabilité.

Quelqu'un peut-il fournir plus de détails sur ce qui devrait être mis à jour au-delà de l'exemple de code lié ci-dessus?

Dois-je implémenter un TrustManager personnalisé? Si oui, que doit-il vérifier?

22
Muzikant

Pour moi, le problème était Mobilecore. J'ai supprimé la bibliothèque de l'application et téléchargé une nouvelle version de l'apk et l'avertissement a disparu de la console de développement GPlay.

3
follacabras

Essayez de rechercher "TrustManager" dans vos codes, si aucun n'est trouvé, la plupart des cas, c'est à cause des bibliothèques tierces incluses.

Pour moi, c'était à cause de l'utilisation d'une ancienne version d'ACRA ( https://github.com/ACRA/acra ).

14
Rejinderi

Peut être en retard, mais j'espère que cela peut aider quelqu'un, appelez cette méthode avant de demander au serveur. Si le certificat n'est pas approuvé, vous avez une boîte de dialogue d'implémentation ou quelque chose pour que l'utilisateur puisse décider, ici j'utilise une boîte de dialogue d'alerte.

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();
        }
    }
3
hoanngothanh

J'ai également identifié que ARCA 4.3 semble être potentiellement le coupable de mon application.

Question, quelqu'un sait-il pour vérifier que le problème est résolu? Actuellement, le Play Store auquel j'ai accès ne provoque pas l'avertissement de Google, mais l'un de nos partenaires qui a publié l'application a reçu l'avertissement. Je souhaite vérifier que le problème est résolu avant de fournir à notre partenaire un nouvel APK.

1
Chris