Google Play Security alert для небезопасного TrustManager
в одном из моих приложений я использую HTTPS с самозаверяющим сертификатом и следовал образцу кода с учебного сайта разработчика android(https://developer.android.com/training/articles/security-ssl.html#UnknownCa).
недавно я получил следующее предупреждение о том, что текущая реализация не защищена:
оповещение безопасность
ваше приложение использует небезопасную реализацию Интерфейс X509TrustManager с HTTP-клиентом Apache, в результате чего уязвимость безопасности. Пожалуйста, смотрите эта статья справочного центра Google для подробности, включая Крайний срок устранения уязвимости.
может ли кто-нибудь предоставить более подробную информацию о том, что должно быть обновлено за пределами примера кода, связанного выше?
должен ли я реализовать пользовательский TrustManager
? Если да, то что он должен подтвердить?
4 ответов
для меня проблема была Mobilecore. Я удалил библиотеку из приложения и загрузил новую версию apk, и предупреждение исчезло из консоли Gplay Dev.
попробуйте найти "TrustManager" в ваших кодах, если ни один не будет найден, в большинстве случаев это происходит из-за сторонних библиотек.
для меня это было из-за использования более старой версии ACRA (https://github.com/ACRA/acra).
может быть поздно, но надеюсь, что это может помочь кому-то, вызовите этот метод перед запросом на сервер. Если сертификат не доверяет, у вас есть диалог реализации или что-то, что пользователь может решить, здесь я использую диалог предупреждения.
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();
}
}
Я также определил, что ARCA 4.3 потенциально может быть виновником для моего приложения.
вопрос, кто-нибудь знает, чтобы проверить, что проблема решена? В настоящее время Play store, к которому у меня есть доступ, не заставляет Google выдавать мне предупреждение, но один из наших партнеров, опубликовавший приложение, получил предупреждение. Я хотел бы убедиться, что проблема решена, прежде чем предоставить нашему партнеру новый APK.