Android WebView SSL «Предупреждение о безопасности» - PullRequest
9 голосов
/ 02 сентября 2010

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

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

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

Подсказки оценены!

Ответы [ 2 ]

6 голосов
/ 12 мая 2012

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

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

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

0 голосов
/ 15 июля 2016

Обновлен ответ в соответствии с новым обновлением политики безопасности 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();

}

...