- PVSM.RU - http://www.pvsm.ru -

Перехват HTTPS-траффика между Android-устройством и внешним сервером

Перехват HTTPS траффика между Android устройством и внешним сервером
Иногда бывает любопытно подсмотреть, что пересылают туда-сюда разные Android-приложения по HTTP и HTTPS протоколам. Иногда даже при разработке собственного ПО удобно видеть весь трафик в реальном времени. Для реализации этих задач давно придумано много хороших программ, таких, к примеру, как Charles [1] или Fiddler2 [2]. На самом деле их намного больше, вот только две вышеуказанные дают возможность нормально просматривать не только HTTP, но и HTTPS.

Трудности начинаются тогда, когда речь заходит о перехвате трафика между Андроид-устройством и внешним сервером. В случае незашифрованного (HTTP-протокол) трафика всё весьма тривиально (вот и инструкция [3] есть) — разрешаем Fiddler2 внешние соединения, в Андроиде устанавливаем прокси сервером адрес нашей машины с Fiddler2 — и вуаля, всё работает. А вот на настройку перехвата HTTPS-трафика у меня ушло чуть больше времени.

Теория

Итак, в чём же сложность? В том, что при использовании протокола HTTPS клиент по-умолчанию проверяет, а действительно ли тот сервер, к которому он подключился, является нужным. Для этого используются сертификаты. И вот у настоящего сервера этот сертификат, понятное дело, тоже настоящий и соответствует открытому URL, а вот у нашего прокси — нет. Для решения этой проблемы в десктопных операционных системах в таких случаях есть возможность сгенирировать в Fiddler2 поддельный сертификат, импортировать его в доверенные — и теперь клиент всегда будет верить, что соединение с Fiddler2 вполне безопасно. К сожалению, с мобильным устройством такой легкий финт ушами не прошел.

Во-первых, возможности импортировать внешний сертификат в Андроиде версий младше 4.0 нет. Есть какие-то не внушающие доверия варианты с рутоваными девайсами — но это не наш путь.
Во-вторых, в Андроид даже версии 4.0 импортировать сертификат Fiddler2 не получается. Дело в том, что генерируемый по-умолчанию сертификат не соответствует каким-то там Андроидовским критериям безопасности и не устанавливается. Его нужно генерировать специальным образом.
В-третьих, совсем даже не факт, что все подряд программы сразу поверят поддельному сертификату. Есть нюансы.

Практика

  1. Берём устройство с Андроидом версии 4.0 или выше. Нет, девайс с 2.3 не подойдет. Да, эмулятор версии 4.0 подойдет.
  2. Устанавливаем на компьютер последнюю версию Fiddler2 [4].
  3. Устанавливаем специальные библиотеки генерации Андроид-совместимого сертификата безопасности отсюда [5].
  4. Экспортируем из Fiddler2 сертификат безопасности («Tools->Fiddler Options->HTTPS->Export root certificate to Desktop»). Кладём на флешку, в корень (ну или на эмулятор, если вы используете его).
  5. На Андроиде добавляем сертификат безопасности в доверенные(«Settings > Security > Install from SD card»)
    Перехват HTTPS траффика между Android устройством и внешним сервером

  6. Запускаем Fiddler2, разрешаем в настройках внешние коннекты
    Перехват HTTPS траффика между Android устройством и внешним сервером.

  7. На Андроиде в настройках сети прописываем в качестве прокси адрес нашей десктопной машины с Fiddler2.
    Перехват HTTPS траффика между Android устройством и внешним сервером

  8. На Андроиде открываем браузер, вводим google.com [6] — и видим запрос с ответом в окне Fiddler2.

Перехват HTTPS траффика между Android устройством и внешним сервером

Итак, с браузером получилось. К сожалению, не все программы столь доверчивы, как браузер. К примеру, в моей собственной софтине, где я использую Apache HTTP Client [7], способ не прокатил — плевал апачевский клиент на доверенные сертификаты операционки. В этом случае мне пришлось отключить эту проверку вручную, таким вот образом:

Protocol.registerProtocol("https", new Protocol("https", new EasySSLProtocolSocketFactory(), 443));

где EasySSLProtocolSocketFactory взят отсюда [8] и разрешает доверие к любым сертификатам.
Не безопасно, только для отладки!

После этого трафик моей программы стал также успешно отображаться в Fiddler2.

Автор: tangro

Источник [9]


Сайт-источник PVSM.RU: http://www.pvsm.ru

Путь до страницы источника: http://www.pvsm.ru/android/18420

Ссылки в тексте:

[1] Charles: http://www.google.ru/url?sa=t&rct=j&q=charles&source=web&cd=1&cad=rja&sqi=2&ved=0CCMQFjAA&url=http%3A%2F%2Fwww.charlesproxy.com%2F&ei=0qGPUPbVMYvR4QTik4C4AQ&usg=AFQjCNG_O70VsRrfb_q7F66Nkb9ZK6MNMA

[2] Fiddler2: http://www.google.ru/url?sa=t&rct=j&q=fiddler&source=web&cd=1&cad=rja&sqi=2&ved=0CCEQFjAA&url=http%3A%2F%2Fwww.fiddler2.com%2F&ei=5KGPUJz-C4aG4gTFsYDoBw&usg=AFQjCNGyVxcKeoiBFf3LsfsM8apoKVxKLQ

[3] инструкция: http://aurir.wordpress.com/2010/03/22/tutorial-getting-android-emulator-working-with-fiddler-http-proxy-tool/

[4] Fiddler2: http://www.fiddler2.com/fiddler2/version.asp

[5] отсюда: http://www.fiddler2.com/dl/FiddlerCertMaker.exe

[6] google.com: https://google.com

[7] Apache HTTP Client: http://hc.apache.org/httpclient-3.x/

[8] отсюда: http://www.jdocs.com/httpclient/3.0.1/org/apache/commons/httpclient/contrib/ssl/EasySSLProtocolSocketFactory.html

[9] Источник: http://habrahabr.ru/post/156711/