HTTPS GET (SSL) с Android и самозаверяющим сертификатом сервера - PullRequest
32 голосов
/ 21 сентября 2010

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

javax.net.ssl.SSLException: Недоверяемый сертификат сервера.

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

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

 https://username:password@anyIPAddress/blabla/index.php?param=1&param2=3

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

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

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

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

Ответы [ 7 ]

36 голосов
/ 28 сентября 2010

Я сделал приложение, которое использует самоподписанные или доверяет всем сертификатам. Источник здесь: 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

РЕДАКТИРОВАТЬ: ссылки обновлены

35 голосов
/ 24 октября 2010

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

ПРЕДУПРЕЖДЕНИЕ: для всех, кто придет к этому ответу, это грязный, ужасный хак, и вы не должны использовать его для всего, что имеет значение.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());

и б) путем создания HostnameVerifier, позволяющего установить соединение, даже еслисертификат не соответствует имени хоста:

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

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

6 голосов
/ 29 сентября 2010

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

6 голосов
/ 21 сентября 2010

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

2 голосов
/ 25 сентября 2010

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

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


Ресурсы:

На ту же тему:

1 голос
/ 24 октября 2010

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

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

Кроме того, учебник, рекомендованный Maciek, очень хорош.

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

0 голосов
/ 13 августа 2015

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

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