веб-просмотр android с сертификатом клиента

Я пытался в течение нескольких дней использовать веб-представление с сертификатом клиента, встроенным в приложение, но мне кажется, что sdk для Android не предоставляет никакого способа сделать это, есть ли обратный вызов для перехвата вызова, отправленного сервером? есть ли способ использовать веб-просмотр с сертификатом клиента и сделать запрос https?

Так как я тоже заинтересован в вашей проблеме, я проверил документацию для 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 использовать их … Поэтому я думаю, вы должны попробовать class 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/

У вас есть мое сочувствие.

Если вам просто нужно игнорировать запросы сертификата ssl внутри веб-представления, это сработало для меня на Lollipop:

Внутри вашего веб-клиента просмотра перепишите:

@Override public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) { handler.proceed(); // Ignore SSL certificate errors } 

Это полезно для отладки веб-просмотров в среде qa / dev / stage.

В API 21 (Android Lollipop) и выше вы можете переопределить WebViewClient.onReceivedClientCertRequest (представление WebView, запрос ClientCertRequest) . В методе используйте ваш менеджер ключей для получения секретного ключа и цепочки сертификатов и вызова request.proceed () .

Чтобы правильно обрабатывать 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(); } 

После этого изменения не будет отображаться предупреждение.

В браузере на базе Chronium на Android 4.4 появилась ошибка: когда сервер запрашивает сертификат клиента, WebView останавливает процесс загрузки. Метод onPageFinished -Method будет немедленно вызван, но страница не будет отображаться.

-> https://code.google.com/p/android/issues/detail?id=62533

Мы не можем получить доступ к сертификату клиента в веб-просмотре. Существует проблема google, поднятая для нее. https://code.google.com/p/android/issues/detail?id=53491

Самостоятельный сертификат SSL работает для меня

Проверьте этот ответ. https://stackoverflow.com/a/49003522/5058630

  • Android Studio - отладочное хранилище
  • Как преобразовать файл .pfx в хранилище ключей с помощью закрытого ключа?
  • Как создать самозаверяющий сертификат с openssl?
  • Извлечение открытого / закрытого ключа из файла PKCS12 для последующего использования в SSH-PK-аутентификации
  • Получить список сертификатов из хранилища сертификатов в C #
  • Где указан формат файла PEM?
  • Программно установить сертификат в Mozilla
  • Как игнорировать создание пути PKIX не удалось: sun.security.provider.certpath.SunCertPathBuilderException?
  • Как предоставить ASP.NET доступ к закрытому ключу в сертификате в хранилище сертификатов?
  • проверка сертификата сервера не удалась. CAfile: /etc/ssl/certs/ca-certificates.crt CRLfile: none
  • Как правильно импортировать самоподписанный сертификат в хранилище ключей Java, доступное для всех приложений Java по умолчанию?
  • Давайте будем гением компьютера.