2010-09-21 2 views
31

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

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

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

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

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

Я полностью осознаю, что это решение является склонным к человеку-в-середине атак и т.д.

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

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

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

+0

Ни один из них работал для меня (усугубляются ошибка Thawte, а не видят HTTP: // бит .ly/bypAk2). В конце концов я получил исправление с http://stackoverflow.com/questions/1217141/self-signed-ssl-acceptance-android и http://stackoverflow.com/questions/2899079/custom-ssl-handling-stopped-working- on-android-2-2-froyo –

ответ

6

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

+0

Я пробовал это, но он не удаляет сообщение об ошибке. –

+0

Он работает для меня, но, по общему признанию, на Java. Вы действительно вызвали его, прежде чем делать какие-либо операции ввода-вывода с соединением? – EJP

+0

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

2

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

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


Ресурсы:

На эту же тему:

+0

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

+0

Я также пробовал некоторые из кода в потоке «HTTPS connection android» - с тем же результатом. Меня беспокоит то, что все те, кто пытается помочь, не предоставляют один фрагмент кода, который работает, и если я объединю фрагменты кода, которые они предоставляют, он не работает. –

+0

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

36

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

+0

Как и @Lars D, другие решения на SO не работают, но этот делает, спасибо много! –

+0

Вторая ссылка не работает. –

+0

Я только что обновил ссылки! – Moss

1

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

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

Также урок, рекомендованный Масиком, очень хорош.

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

35

Как вы правильно указываете, есть две проблемы: 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()); 

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

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

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

+2

У меня есть попробовал это, и я могу подтвердить, что он работает. –

+0

Я второй, это тоже работает для меня – plainjimbo

+4

Вопрос уже упоминал о проблемах безопасности. Однако, когда вы пробивались через хранилище ключей и сортировали сертификаты и - спустя несколько часов - потому что «GlobalTrust CA, Inc.» - это не то же самое, что «GlobalTrust CA Inc.» (без запятой), вы начинаете думать, если данные разумны вообще - и я очень благодарен за фрагмент кода, чтобы «отключить безопасность», . По крайней мере, для прототипа ... – BurninLeo

0

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

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