2016-02-17 2 views
21

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

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

Security

Вашего приложение с использованием небезопасной реализации интерфейса X509TrustManager с клиентом Apache HTTP , что приводит к уязвимости безопасности . Пожалуйста, см. this Google Help Center article для . Подробности, включая крайний срок для устранения уязвимости.

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

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

+1

Гм, что, кажется, рассматривается в [статье Справочного Google Center] (https://support.google.com/faqs/answer/6346016): «Для того, чтобы правильно обрабатывать SSL проверки сертификата, измените свой код в методе checkServerTrusted вашего пользовательского интерфейса X509TrustManager, чтобы поднять либо исключение CertificateException, либо исключение IllegalArgumentException всякий раз, когда сертификат, представленный сервером, не соответствует вашим ожиданиям ». Как именно вы настраиваете свой «TrustManager»? Как вы его используете? – CommonsWare

+0

@CommonsWare точно так же, как в примере кода https://developer.android.com/training/articles/security-ssl.html#UnknownCa Должен ли я делать что-то другое? – Muzikant

+0

На странице, к которой вы привязались, нет кода для сценария сценария самозаверяющего сервера. Существует код сценария неизвестных сертификатов. – CommonsWare

ответ

3

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

14

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

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

+0

Как упоминалось в комментариях к вопросу, это был аналогичный случай с другой сторонней библиотекой. – Muzikant

+1

. Есть ли способ поймать эту проблему во время компиляции, например, используя Lint или любой инструмент статического анализа , – Pavan

+0

Что касается ACRA, см. Https://github.com/ACRA/acra/issues/374 – mhsmith

1

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

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

2

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

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