Я создаю тестовую версию приложения для клиента. Часть этого приложения использует WebView, который обращается к сайту на основе SSL. В свою очередь, клиент предоставил тестовый домен, в котором имя сертификата не соответствует полному доменному имени. Увы, они не в состоянии предоставить соответствующий сертификат. :(
Я работаю над этой проблемой в сопутствующем специальном приложении iOS с одной строкой кода (опять же, не для производственного использования - только для целей тестирования). Я искал аналогичную информацию об ОС Android, но решений, которые я видел здесь и в других местах, достаточно, чтобы по сравнению с ними у меня закружилась голова!
Есть ли простой способ обойти это? Даже настройки, ориентированные на пользователя, где-то спрятаны?
Подсказки приветствуются!
Ответ 1 · рейтинг 6 · Lee
Создайте WebViewClient и обработайте onReceivedSslError, который выглядит следующим образом:
public void onReceivedSslError (WebView view, SslErrorHandler handler, SslError error)
Внутри этого обратного вызова вы можете просто вызвать handler.proceed(), и страница продолжит загрузку. Если вы не обработаете этот обратный вызов и не вызовете метод proceed(), то по умолчанию страница не будет загружаться.
Ответ 2 · рейтинг 1 · Anant Shah
Обновленный ответ в соответствии с новым обновлением политики безопасности 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();
}