2014-07-04 4 views
5

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

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

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

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

+0

Если вы хотите, чтобы мы помогли, вы должны предоставить реальную информацию, а не использовать чужой сайт, такой как 'xyz.com' (это настоящий сайт). – jww

+0

Извините, что я использовал действительный хост. К сожалению, я не могу раскрывать информацию о клиенте и надеюсь, что вы это поймете. – bjoernb

ответ

2

Ну 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 документации

Общих проблем с Hostname проверкой Как уже упоминались в начала этой статьи, есть два ключевые частей верификации 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. К сожалению, HTTP-клиент Apache этого не делает, что является одной из многих причин, по которым мы отказываемся использовать его. Один обходной путь, если вам необходимо поддерживать Android 2.2 (и старше) или Apache HTTP Client - это настроить альтернативный виртуальный хост на уникальный порт, чтобы он однозначно , какой сертификат сервера должен быть возвращен.

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

Смежные вопросы