Я пытался в течение нескольких дней использовать веб-представление с сертификатом клиента, встроенным в приложение, но мне кажется, что sdk для Android не предоставляет никакого способа сделать это, есть ли обратный вызов для перехвата вызова, отправленного сервер? есть ли способ использовать веб-просмотр с сертификатом клиента и сделать запрос https?
Веб-просмотр android с сертификатом клиента
Ответ 1
Так как меня интересует также ваша проблема, я проверил документацию для WebView и WebViewClient, просмотрел ее и действительно, кажется, что вы не можете аутентифицировать сеанс веб-просмотра с использованием сертификата клиента в качестве необходимого метода (ClientCertRequestHandler) не является общедоступным API.
Использование Android WebView для подключения к защищенному серверу с сертификатом клиента
Поиск в обсуждениях Android Security подтверждает, что вызов действительно недоступен:
https://groups.google.com/forum/#!msg/android-security-discuss/0hzTGaA9swQ/1Oqc8UpGLH8J
и даже если
В выпуске Android 4.0 включена поддержка проверки подлинности сертификата клиента в браузере.
(ссылка: https://code.google.com/p/android/issues/detail?id=8196)
не упоминается о WebViews: (
Несмотря на то, что есть несколько новых API для загрузки сертификатов в Keychain:
http://developer.android.com/reference/android/security/KeyChain.html http://nelenkov.blogspot.it/2011/11/using-ics-keychain-api.html
неясно, будет ли WebView использовать их... Поэтому я думаю, вы должны попробовать класс KeyChain и посмотреть, можете ли вы правильно аутентифицироваться (у меня нет простого способа проверить это, так что вы сами по себе).
Если KeyChain не работает с WebViews, я думаю, все это сводится к нескольким далеким от идеальных обходных решений:
Решение 1:
использовать ClientCertRequestHandler в любом случае (он помечен как скрытый, но, видимо, все еще пригодный для использования):
https://code.google.com/p/android/issues/detail?id=53491
Однако даже если предположить, что вы это сделали, Android Dev. Команда может изменять/удалять метод без уведомления, и ваше приложение может перестать работать над будущими версиями SO.
Решение 2:
Если вы можете ограничить свою цель до Android 4.0 или новее, смелое (и маловероятное...) решение состоит в попытке загрузить сертификат в веб-виде из локального хранилища с помощью файловой схемы:
Загрузите локальный HTML файл в WebView
но я сильно сомневаюсь, что веб-просмотр будет вести себя как браузер...
Решение 3: (которое должно работать, но требует больших усилий)
Обрабатывайте каждое https-соединение в фоновом режиме с помощью HTTPClient или HttpURLConnection, а затем передавайте данные в WebView:
http://chariotsolutions.com/blog/post/https-with-client-certificates-on/
У вас есть мое сочувствие.
Ответ 2
Если вам просто нужно игнорировать запросы сертификата ssl внутри веб-представления, это сработало для меня на Lollipop:
Внутри вашего веб-клиента просмотра перепишите:
@Override
public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) {
handler.proceed(); // Ignore SSL certificate errors
}
Это полезно для отладки веб-просмотров в среде qa/dev/stage.
Ответ 3
В API 21 (Android Lollipop) и выше вы можете переопределить WebViewClient.onReceivedClientCertRequest(представление WebView, запрос ClientCertRequest). В методе используйте свой менеджер ключей для получения секретного ключа и цепочки сертификатов и вызовите request.proceed().
Ответ 4
В браузере на базе Chronium на Android 4.4 появилась ошибка: когда сервер запрашивает сертификат клиента, WebView останавливает процесс загрузки. Метод onPageFinished будет немедленно вызван, но страница не будет отображаться.
- > https://code.google.com/p/android/issues/detail?id=62533
Ответ 5
Чтобы правильно обрабатывать SSL-сертификат, чтобы предотвратить отклонение приложения от Google в соответствии с обновленной политикой безопасности, измените свой код, чтобы вызывать 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();
}
После этого изменения не будут отображаться предупреждения.
Ответ 6
Мы не можем получить доступ к сертификату клиента в webview, Есть проблема google, поднятая для того же самого. https://code.google.com/p/android/issues/detail?id=53491