Архивные материалы

Перехват HTTPS-траффика между Android-устройством и внешним сервером / Блог компании Инфопульс Украина / Хабрахабр

Материал перенесён из старой базы знаний ATC-IP и оформлен в едином стиле нового сайта.

TM Feed
Хабрахабр
Мегамозг
Geektimes
Тостер
Мой круг
Фрилансим
Разделы
Публикации
Хабы
Компании
Пользователи
Q&A
Песочница
Инфопульс Украина
хабраиндекс
211,82
Профиль
Блог
Подписчики
+1
30 октября 2012 в 15:10
Перехват HTTPS-траффика между Android-устройством и внешним сервером
tutorial
Блог компании Инфопульс Украина
Разработка под Android
Иногда бывает любопытно подсмотреть, что пересылают туда-сюда разные Android-приложения по HTTP и HTTPS протоколам. Иногда даже при разработке собственного ПО удобно видеть весь трафик в реальном времени. Для реализации этих задач давно придумано много хороших программ, таких, к примеру, как
Charles
или
Fiddler2
. На самом деле их намного больше, вот только две вышеуказанные дают возможность нормально просматривать не только HTTP, но и HTTPS.
Трудности начинаются тогда, когда речь заходит о перехвате трафика между Андроид-устройством и внешним сервером. В случае незашифрованного (HTTP-протокол) трафика всё весьма тривиально (вот и
инструкция
есть) — разрешаем Fiddler2 внешние соединения, в Андроиде устанавливаем прокси сервером адрес нашей машины с Fiddler2 — и вуаля, всё работает. А вот на настройку перехвата HTTPS-трафика у меня ушло чуть больше времени.
Теория
Итак, в чём же сложность? В том, что при использовании протокола HTTPS клиент по-умолчанию проверяет, а действительно ли тот сервер, к которому он подключился, является нужным. Для этого используются сертификаты. И вот у настоящего сервера этот сертификат, понятное дело, тоже настоящий и соответствует открытому URL, а вот у нашего прокси — нет. Для решения этой проблемы в десктопных операционных системах в таких случаях есть возможность сгенирировать в Fiddler2 поддельный сертификат, импортировать его в доверенные — и теперь клиент всегда будет верить, что соединение с Fiddler2 вполне безопасно. К сожалению, с мобильным устройством такой легкий финт ушами не прошел.
Во-первых, возможности импортировать внешний сертификат в Андроиде версий младше 4.0 нет. Есть какие-то не внушающие доверия варианты с рутоваными девайсами — но это не наш путь.
Во-вторых, в Андроид даже версии 4.0 импортировать сертификат Fiddler2 не получается. Дело в том, что генерируемый по-умолчанию сертификат не соответствует каким-то там Андроидовским критериям безопасности и не устанавливается. Его нужно генерировать специальным образом.
В-третьих, совсем даже не факт, что все подряд программы сразу поверят поддельному сертификату. Есть нюансы.
Практика
Берём устройство с Андроидом версии 4.0 или выше. Нет, девайс с 2.3 не подойдет. Да, эмулятор версии 4.0 подойдет.
Устанавливаем на компьютер последнюю версию
Fiddler2
Устанавливаем специальные библиотеки генерации Андроид-совместимого сертификата безопасности
отсюда
Экспортируем из Fiddler2 сертификат безопасности («Tools->Fiddler Options->HTTPS->Export root certificate to Desktop»). Кладём на флешку, в корень (ну или на эмулятор, если вы используете его).
На Андроиде добавляем сертификат безопасности в доверенные(«Settings > Security > Install from SD card»)
Запускаем Fiddler2, разрешаем в настройках внешние коннекты
На Андроиде в настройках сети прописываем в качестве прокси адрес нашей десктопной машины с Fiddler2.
На Андроиде открываем браузер, вводим
google.com
— и видим запрос с ответом в окне Fiddler2.
Итак, с браузером получилось. К сожалению, не все программы столь доверчивы, как браузер. К примеру, в моей собственной софтине, где я использую
Apache HTTP Client
, способ не прокатил — плевал апачевский клиент на доверенные сертификаты операционки. В этом случае мне пришлось отключить эту проверку вручную, таким вот образом:
Protocol.registerProtocol(
"https"
new
Protocol(
"https"
new
EasySSLProtocolSocketFactory(),
443
));
где
EasySSLProtocolSocketFactory
взят
отсюда
и разрешает доверие к любым сертификатам.
Не безопасно, только для отладки!
После этого трафик моей программы стал также успешно отображаться в Fiddler2.
Android
HTTPS
+33
35535
323
tangro
48,2
Похожие публикации
Обнаружены поддельные сертификаты для доменов Google
(50)
Модификация HTTP-трафика с помощью FiddlerScript и .NET-плагинов к Fiddler
(3)
Proxygen — HTTP-фреймворк для С++ от Facebook
(19)
Шпаргалка по HTTP-библиотекам для С++
(38)
Эмулятор Bluestacks + Eclipse: ускоряем отладку и тестирование Android-приложений
(38)
Комментарии (
16
–4
anoshenko
30 октября 2012 в 15:25
Мы делали это проще. Машину с установленым Wireshark прописываем как gateway на телефоне. А дальше просто анализаруем Wireshark`ом трафик.
zZoMROT
30 октября 2012 в 15:36
А если хочется поделать что-то руками и почувствовать себя тру-хацкером, то есть LIBPCAP. Кстати, написанное приложение можно будет поставить прямо на телефон.
+34
ivlis
30 октября 2012 в 15:49
https, ага.
+4
Alexufo
30 октября 2012 в 18:46
Wireshark понимает https если в него вставить ключи выданные сервером. И очень часто доступа к серверу нет.
–12
ajev
30 октября 2012 в 16:51
По заголовку, ждал разгромную статью о том, что https устарел, в нем много дыр, и смотрите — он типа ничего не защищает… А статья о том, как человек трафик мониторил.
+2
Prototik
30 октября 2012 в 18:46
Не курите так.
tangro
30 октября 2012 в 19:36
Там лэйбочка «tutorial» в заголовке, а в статье — ровно то, что написано в заголовке и ничего больше.
ajev
31 октября 2012 в 10:51
Да, проглядел, прошу прощения.
Позвонить +7 (343) 382-33-16