Эмулятор Android не подключается к локальному веб-сервису через https - PullRequest
3 голосов
/ 09 февраля 2012

Я пытаюсь вызвать веб-сервис, размещенный в локальной сети, используя защищенное соединение https, сначала он выдал исключение HostNameUnresolved, поэтому я использовал IP-адрес вместо имени, теперь я получаю следующую ошибку:

Error in geting tags.=javax.net.ssl.SSLException: hostname in certificate didn't match: <10.100.248.99> !=

Я уже добавил промежуточный и корневой сертификаты в список доверенных для Android.

Может ли кто-нибудь дать мне решение для доступа к безопасному веб-сервису в локальной сети, используя имя хоста, а не IP-адрес?

Ответы [ 3 ]

1 голос
/ 23 марта 2012

Как уже упоминалось, вам нужно несколько вещей для подключения вашего веб-сервиса:
- эмулятор, чтобы узнать IP-адрес сервера, к которому нужно подключиться
- URL-адрес имени сервера, который вы подключаете через HTTPS, должен разрешаться в домене сертификата SSL

Для этого вам необходимо:

  • смонтировать разделы эмулятора writeable

Из оболочки вашего рабочего стола (пример для linux, но он будет похож на Windows, и предположим, что Android SDK установлен на /android-sdk):

cd /android-sdk/tools/
./emulator -avd NexusS -partition-size 128

где NexusS - это имя AVD вашего устройства. Вы MUST запускаете эмулятор из командной строки, или вы получите ошибку в последующих шагах.

Теперь откройте другой терминал оболочки и получите файл эмулятора / system / etc / hosts:

cd /android-sdk/platform-tools
./adb remount
./adb pull /system/etc/hosts /tmp/

remount - установить разделы для записи. Приведенная выше команда pull копирует файл hosts в /tmp/hosts вашего рабочего стола.
С рабочего стола отредактируйте файл / tmp / hosts в соответствии с вашими потребностями, т. Е. Если веб-служба https://www.example.com/foo и IP - 192.168.1.10:

127.0.0.1      locahost
192.168.1.10   www.example.com

Затем верните его обратно в эмулятор:

cd /android-sdk/platform-tools
./adb push /tmp/hosts /system/etc/

Теперь вы сможете подключиться к веб-сервису.

Обратите внимание, что в случае самозаверяющего сертификата у вас все еще может быть ошибка.

Изображение ниже перед редактированием файла hosts:
IP doesn't match the certificate

После редактирования:
Server name match

1 голос
/ 23 марта 2012

Вы должны использовать HostnameVerifier , чтобы доверять Android с данным хостом.

HttpParams params = new BasicHttpParams();
HttpConnectionParams.setConnectionTimeout(params, 5000);
HttpConnectionParams.setSoTimeout(params, 30000);
HostnameVerifier hostnameVerifier = org.apache.http.conn.ssl.SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER;

DefaultHttpClient httpClient = new DefaultHttpClient();

SchemeRegistry registry = new SchemeRegistry();
SSLSocketFactory socketFactory = SSLSocketFactory.getSocketFactory();
socketFactory.setHostnameVerifier((X509HostnameVerifier) hostnameVerifier);
registry.register(new Scheme("https", socketFactory, 443));
SingleClientConnManager mgr = new SingleClientConnManager(httpClient.getParams(), registry);
DefaultHttpClient client = new DefaultHttpClient(mgr, httpClient.getParams());

// Set verifier      
HttpsURLConnection.setDefaultHostnameVerifier(hostnameVerifier);

Теперь выполнить запрос, который вы хотите на клиенте объект.

1 голос
/ 22 марта 2012

Однажды я увидел похожую ошибку в одном из проектов, которые делал мой коллега, и причина, по которой мы узнали, заключалась в том, что если вы пытаетесь совершать сетевые вызовы из основного потока пользовательского интерфейса, система Android блокирует его, хотя эта функция была введена Позже API, как и раньше, работал нормально. Это было сделано для того, чтобы уменьшить нагрузку на основной поток пользовательского интерфейса, поэтому мы создали отдельный сервис, а затем в нем мы предоставили асинхронную задачу для сетевых вызовов. Я не помню точный уровень API, на котором он был представлен, но вы всегда можете проверить его в goggle, а также по тому, какой уровень API вы используете?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...