Android WebView SSL «Предупреждение безопасности»

Я создаю тестовую версию приложения для клиента. Часть этого приложения использует WebView, который обращается к сайту на основе SSL. В свою очередь, клиент предоставил тестовый домен, в котором имя сертификата не соответствует полному доменному имени. Увы, они не в состоянии предоставить соответствующий сертификат. :(

Я работаю над этой проблемой в сопутствующем специальном приложении iOS с одной строкой кода (опять же, не для производственного использования — только для целей тестирования). Я искал аналогичную информацию об ОС Android, но решений, которые я видел здесь и в других местах, достаточно, чтобы по сравнению с ними у меня закружилась голова!

Есть ли простой способ обойти это? Даже настройки, ориентированные на пользователя, где-то спрятаны?

Подсказки приветствуются!


person Joe D'Andrea    schedule 02.09.2010    source источник


Ответы (2)


Создайте WebViewClient и обработайте onReceivedSslError, который выглядит следующим образом:

public void onReceivedSslError (WebView view, SslErrorHandler handler, SslError error)

Внутри этого обратного вызова вы можете просто вызвать handler.proceed(), и страница продолжит загрузку. Если вы не обработаете этот обратный вызов и не вызовете метод proceed(), то по умолчанию страница не будет загружаться.

person Lee    schedule 12.05.2012
comment
ПРЕДУПРЕЖДЕНИЕ: Это опасно — это лишает SSL всех средств защиты. Я знаю, что Джо хочет включить его только в свое тестовое приложение, и это хорошо, но сообщество безопасности видело много случаев, когда такого рода код непреднамеренно проникал в рабочие версии, незаметно и непреднамеренно ставя под угрозу их безопасность. Поэтому, если вы отключите безопасность таким образом, БУДЬТЕ ОЧЕНЬ ОСТОРОЖНЫ, чтобы убедиться, что это не распространяется на ваши выпускные версии. Благодарим вас за то, что выслушали это объявление общественной службы. - person D.W.; 26.02.2013

Обновленный ответ в соответствии с новым обновлением политики безопасности Google для обработчика ошибок SSL, см. этот раздел Разработчики Android Статья Справочного центра.

Для предотвращения отклонения приложения в Google Play за нарушение нашей политики в отношении злонамеренного поведения.

Чтобы правильно обрабатывать проверку SSL-сертификата, измените код так, чтобы он вызывал SslErrorHandler.proceed() всякий раз, когда сертификат, представленный сервером, соответствует вашим ожиданиям, и вызывал SslErrorHandler.cancel() в противном случае.

Например, я добавляю диалоговое окно с предупреждением, чтобы пользователь подтвердил, и кажется, что Google больше не показывает предупреждение.

@Override
public void onReceivedSslError(WebView view, final SslErrorHandler handler, SslError error) {
final AlertDialog.Builder builder = new AlertDialog.Builder(this);
 String message = "SSL Certificate error.";
    switch (error.getPrimaryError()) {
        case SslError.SSL_UNTRUSTED:
            message = "The certificate authority is not trusted.";
            break;
        case SslError.SSL_EXPIRED:
            message = "The certificate has expired.";
            break;
        case SslError.SSL_IDMISMATCH:
            message = "The certificate Hostname mismatch.";
            break;
        case SslError.SSL_NOTYETVALID:
            message = "The certificate is not yet valid.";
            break;
    }
    message += " Do you want to continue anyway?";

    builder.setTitle("SSL Certificate Error");
    builder.setMessage(message);

builder.setPositiveButton("continue", new DialogInterface.OnClickListener() {
    @Override
    public void onClick(DialogInterface dialog, int which) {
        handler.proceed();
    }
});
builder.setNegativeButton("cancel", new DialogInterface.OnClickListener() {
    @Override
    public void onClick(DialogInterface dialog, int which) {
        handler.cancel();
    }
});
final AlertDialog dialog = builder.create();
dialog.show();

}

person Anant Shah    schedule 15.07.2016