HTTPS GET (SSL) с Android и самозаверяющим сертификатом сервера

Я просмотрел различные сообщения о том, как получить что-то через HTTPS на Android, с сервера, который использует самозаверяющий сертификат. Однако ни один из них, похоже, не работает – все они не удаляют

javax.net.ssl.SSLException: сообщение сертификата несертифицированного сервера.

Невозможно изменить сервер, чтобы иметь доверенный сертификат, а также не является возможным, чтобы сертификат сервера соответствовал IP-адресу сервера.

Обратите внимание, что сервер не будет иметь DNS-имя, он будет иметь только IP-адрес. Запрос GET выглядит примерно так:

  https://username:[email protected]/blabla/index.php?param=1&param2=3 

Я полностью осознаю, что это решение подвержено атакам типа «человек в середине» и т. Д.

Таким образом, решение должно игнорировать отсутствие доверия к сертификату и игнорировать несоответствие имени хоста.

Кто-нибудь знает код, который делает это, используя Java для Android?

Есть много попыток объяснить это на stackoverflow.com и множество fragmentов кода, но они, похоже, не работают, и никто не предоставил один блок кода, который решает это, насколько я могу судить. Было бы интересно узнать, действительно ли кто-то решил это, или если Android просто блокирует сертификаты, которым не доверяют.

Я сделал приложение, которое использует самоподписанные или доверяет всем сертификатам. Источник находится здесь: http://code.google.com/p/meneameandroid/source/browse/#svn/trunk/src/com/dcg/auth и может свободно использоваться: P

Просто используйте HttpManager и создайте фабрику SSL, используя все доверие: http://code.google.com/p/meneameandroid/source/browse/trunk/src/com/dcg/util/HttpManager.java

EDIT: обновлены ссылки

Как вы правильно указываете, есть две проблемы: a) сертификат не доверен, и b) имя в сертификате не совпадает с именем хоста.

ПРЕДУПРЕЖДЕНИЕ: для кого-либо другого, приходящего на этот ответ, это грязный, ужасный хак, и вы не должны использовать его для чего-либо, что имеет значение. SSL / TLS без аутентификации хуже, чем отсутствие шифрования – чтение и изменение ваших «зашифрованных» данных тривиально для злоумышленника, и вы даже не подозревали, что это происходит .

Все еще со мной? Я боялся …

а) решается путем создания настраиваемого SSLContext, TrustManager которого принимает что-либо:

 SSLContext ctx = SSLContext.getInstance("TLS"); ctx.init(null, new TrustManager[] { new X509TrustManager() { public void checkClientTrusted(X509Certificate[] chain, String authType) {} public void checkServerTrusted(X509Certificate[] chain, String authType) {} public X509Certificate[] getAcceptedIssuers() { return new X509Certificate[]{}; } } }, null); HttpsURLConnection.setDefaultSSLSocketFactory(ctx.getSocketFactory()); 

и b) путем создания HostnameVerifier, который позволяет продолжить соединение, даже если сертификат не соответствует имени хоста:

 HttpsURLConnection.setDefaultHostnameVerifier(new HostnameVerifier() { public boolean verify(String hostname, SSLSession session) { return true; } }); 

Оба должны произойти прямо в начале вашего кода, прежде чем вы начнете возиться с HttpsURLConnections и так далее. Это работает как в Android, так и в обычной JRE. Наслаждаться.

Если вы используете HttpsURLConnection, попробуйте вызвать setHostnameVerifier на нем перед connect() и передать ему HostnameVerifier который просто принимает независимо от правдоподобия.

Вы можете сделать это спокойно: http://blog.crazybob.org/2010/02/android-trusting-ssl-certificates.html

Если у вас есть доступ к устройствам, вы можете добавить сертификат в хранилище ключей. Подробнее здесь .

С другой стороны, вы можете использовать этот метод, но я думаю, что это отвратительно.


Ресурсы :

  • developer.android.com – SSLSocketFactory
  • Android и самозаверяющие сертификаты ssl

По той же теме:

  • Https Connection Android
  • HTTPS с самоподписанными сертификатами SSL-решений … Решение или лучший способ?
  • Подтвержденный SSL-прием Android

Если вы спросите меня, сделайте это безопасным способом.

Нашел хороший учебник http://blog.antoine.li/index.php/2010/10/android-trusting-ssl-certificates/, и это действительно не так сложно реализовать.

Также рекомендуется учебник, рекомендованный Maciek.

Я тестировал его, и он работает в моем приложении без проблем.

Я сделал приложение, которое использует самоподписанный сертификат 4 месяца назад, вот код, на который я надеюсь: https://bitbucket.org/momo0002/tlsdemo.git

  • Круглые до двух знаков после запятой
  • Точка входа для приложений Java: main (), init () или run ()?
  • Ошибка при создании apk - «Несколько файлов dex определяют Lcom / google / ads / Ad»
  • Как я могу перечислять все classы в пакете и добавлять их в список?
  • NoClassDefFoundError для проекта внешней библиотеки для Android
  • Как исправить android.os.NetworkOnMainThreadException?
  • Использование активности камеры в Android
  • Как сделать объединение, пересечение, разность и обратные данные в java
  • Как настроить пользовательское хранилище ключей для отладки в eclipse для Android
  • Преобразование строки json в java-объект?
  • Как версия Java для Android относится к версии Java SE?
  • Давайте будем гением компьютера.