Подтвердить что ты не робот

Предупреждение безопасности Google Play для небезопасного TrustManager

В одном из моих приложений я использую HTTPS с самозаверяющим сертификатом и следую примеру кода с сайта обучения разработчиков Android (https://developer.android.com/training/articles/security-ssl.html#UnknownCa).

Недавно я получил следующее предупреждение о том, что текущая реализация не защищена:

Предупреждение безопасности

В вашем приложении используется небезопасная реализация Интерфейс X509TrustManager с клиентом Apache HTTP, в результате чего уязвимость системы безопасности. См. в этой статье Справочного центра Googleдетали, включая крайний срок для исправления уязвимости.

Может ли кто-нибудь предоставить более подробную информацию о том, что должно быть обновлено за пределами кода примера, связанного выше?

Должен ли я реализовать пользовательский TrustManager? Если да, то что он должен проверить?

4b9b3361

Ответ 1

Для меня проблема была Mobilecore. Я удалил библиотеку из приложения и загрузил новую версию apk, и предупреждение исчезло из консоли GPlay Dev.

Ответ 2

Попробуйте найти "TrustManager" в ваших кодах, если ни один не найден, в большинстве случаев это связано с включенными сторонними библиотеками.

Для меня это было из-за использования более старой версии ACRA (https://github.com/ACRA/acra).

Ответ 3

Может опаздывать, но надеюсь, что это может помочь кому-то, вызовите этот метод перед запросом на сервер. Если сертификат не доверяет, у вас есть диалоговое окно реализации или что-то такое, что пользователь может решить, здесь я использую диалоговое окно с предупреждением.

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

Ответ 4

Я также обнаружил, что ARCA 4.3 потенциально может быть виновником моего приложения.

Вопрос: кто-нибудь знает, чтобы убедиться, что проблема решена? В настоящее время у Play Store, к которому у меня есть доступ, не является причиной того, что Google выдает мне предупреждение, но один из наших партнеров, опубликовавший приложение, получил предупреждение. Я хотел бы подтвердить, что проблема решена, прежде чем предоставить нашему партнеру новый APK.