Сертификаты WebView и SSL

У меня проблемы с загрузкой защищенных веб-страниц SSL с помощью Androids WebView. Я всегда получаю такие ошибки, как: onReceivedSslError: primary error: 3 certificate: Issued to: CN=intranet.<company>.de,C=DE,O=<company>,OU=<compay org unit>

Я уже установил все сертификаты цепочки сертификатов этого сервера в брелок для Android через Настройки-> Безопасность-> Установить с SD-карты. Я даже вижу, что один из установленных сертификатов идеально подходит для вывода ошибок из LogCat. Еще более странно, если я использую приложение браузера по умолчанию: он загружает страницу без проблем, даже если я удалю все сертификаты, упомянутые ранее. Я действительно не знаю, как я могу это исправить, не доверяя всем сертификатам, вызывая handler.proceed() в onReceivedSslError() который является потенциальной проблемой безопасности. Любая помощь приветствуется. Благодаря!

Приветствие Бьорн

EDIT: корневой сертификат самоподписан, потому что он предназначен только для серверов интрасети. Я думал, что всем сертификатам, которые я добавляю к доверенным учетным данным Android, будет доверено.

Ну onReceiveSslError() и handler.proceed() следует использовать при подключении к службам с самоподписанными сертификатами, веб-просмотр не согласуется с ними.

Думаю, что я бы посмотрел прямо сейчас, это реализация ssl на стороне сервера. Если у вас есть несколько сервисов с той же проверкой сертификата для поддержки SNI и если он настроен правильно. Затем посмотрите, подключен ли сервис, с которым вы подключаете, правильный сертификат. Также проверьте альтернативное имя объекта на своем сервере и настройте его под свои нужды.

Для этой задачи вы можете использовать эти команды.

 openssl s_client -showcerts -connect yourhost.com:443 openssl s_client -connect yourhost.com:443 openssl s_client -servername yourhost.com -connect yourhost.com:443 openssl s_client -connect yourhost.com:443 | openssl x509 -text 

Здесь у вас есть дополнительная информация из документации для Android

Общие проблемы с проверкой имени хоста Как упоминалось в начале этой статьи, есть две ключевые части для проверки соединения SSL. Первый – проверить сертификат от надежного источника, который был в центре внимания предыдущего раздела. Основное внимание в этом разделе уделяется второй части: убедитесь, что сервер, на котором вы говорите, представляет правильный сертификат. Когда этого не произойдет, вы, как правило, увидите ошибку:

Java.io.IOException: Hostname 'example.com' не был проверен на libcore.net.http.HttpConnection.verifySecureSocketHostname (HttpConnection.java:223) на libcore.net.http.HttpsURLConnectionImpl $ HttpsEngine.connect (HttpsURLConnectionImpl.java:446 ) На libcore.net.http.HttpEngine.sendSocketRequest (HttpEngine.java:290) на libcore.net.http.HttpEngine.sendRequest (HttpEngine.java:240) на libcore.net.http.HttpURLConnectionImpl.getResponse (HttpURLConnectionImpl.java: 282) в libcore.net.http.HttpURLConnectionImpl.getInputStream (HttpURLConnectionImpl.java:177) в libcore.net.http.HttpsURLConnectionImpl.getInputStream (HttpsURLConnectionImpl.java:271) Одна из причин этого может произойти из-за ошибки конфигурации сервера. Сервер настроен с сертификатом, который не имеет полей имени субъекта или субъекта, которые соответствуют серверу, который вы пытаетесь достичь. Возможно использование одного сертификата на разных серверах. Например, глядя на сертификат google.com с openssl s_client -connect google.com:443 | Openssl x509 -text вы можете видеть тему, которая поддерживает * .google.com, но также и альтернативные имена для * .youtube.com, * .android.com и других. Ошибка возникает только в том случае, если имя сервера, к которому вы подключаетесь, не указано сертификатом как приемлемое.

К сожалению, это может произойти и по другой причине: виртуальный хостинг. При совместном использовании сервера для более чем одного имени хоста с HTTP, веб-сервер может определить из запроса HTTP / 1.1, имя целевого хоста, которое ищет клиент. К сожалению, это осложняется HTTPS, потому что сервер должен знать, какой сертификат вернуть, прежде чем он увидит HTTP-запрос. Для решения этой проблемы более новые версии SSL, в частности TLSv.1.0 и более поздних версий, поддерживают идентификацию имени сервера (SNI), которая позволяет клиенту SSL указывать предполагаемое имя хоста на сервере, чтобы можно было вернуть правильный сертификат.

К счастью, HttpsURLConnection поддерживает SNI с Android 2.3. К сожалению, Apache HTTP Client этого не делает, что является одной из многих причин, по которым мы препятствуем его использованию. Один обходной путь, если вам нужно поддерживать Android 2.2 (и старше) или Apache HTTP Client, – это настроить альтернативный виртуальный хост на уникальном порту, чтобы однозначно вернуть серверный сертификат.

Надеюсь, поможет.

Intereting Posts
Как установить альфа-значение всего представления на уровне api 7 (Android 2.1) ANDROID Возможно ли просматривать только определенную страну на карте Google? Список существующих виртуальных устройств Android пуст Применить анимацию на Drawable в Android Подождите, пока элемент smoothScrollToPosition () в ListView Android EditText внутри ListView? Идентификатор проекта GCM GC, какой? Вывод производительности Android на сетевой диск (samba share) Сенсор направления Android Android: изменить цвет с цвета на цвет Возможно ли удаленно размещать ресурс, используемый в приложении для Android, таким образом, что его можно использовать только моим приложением? Лучшая практика для вложенных фрагментов в Android 4.0, 4.1 (<4.2) без использования библиотеки поддержки LAYER_TYPE_SOFTWARE вызывает загрузку пустой страницы WebView Не удалось создать экземпляр фрагмента Как разместить границу вокруг андроидного релятивирования?