Как проверить трафик websocket с помощью charlesproxy для iOS-симулятора/устройств

Вопрос:

Я хотел бы проверить сетевой трафик через веб-сокеты, у меня нет контроля над сетевым кодом, поскольку это двоичная библиотека, для которой у меня нет исходного кода, поэтому Я не могу сделать log/breakpoint в сетевой части кода.

Я пробовал использовать последнюю версию CharlesProxy, которая утверждает, что может обнюхать веб-сайты, но когда я попытался использовать url и apis с помощью веб-сокетов, не упоминалось даже в списке конечных точек, вызываемых с моего iPhone.

Примечания к выпуску версии 3.11

Я проверил, что CharlesProxy настроен правильно, поскольку я могу проверять трафик не-websocket даже под SSL.

Итак, мой вопрос: кто-нибудь нашел решение для проверки трафика, проходящего через websockets с помощью CharlesProxy?

Примечание. У меня отключена ATS при использовании iOS9

Спасибо!

Лучший ответ:

Я наконец нашел ответ.

Charles 3.11.2 отлично работает с WebSocket.

Я использую socketIO, поэтому я уже видел запросы http, отправленные на этапе согласования, но пропустил трафик websockets.

Вначале socketIO пытается использовать опрос, а затем переключается на использование веб-сокетов.

Трафик веб-сокета виден, когда вы переходите к запросу со статусом: “Тело отправки запроса”, которое на самом деле является запросом wss://.

У вас даже есть выделенная вкладка для этого вида трафика. Остальные сообщения появятся прямо там.

enter image description here

PS1. Убедитесь, что вы правильно подключены к сокету, тогда он появится в Charles.
PS2. Я предлагаю использовать socketIO – это отличное улучшение для полнодуплексного трафика, такого как веб-сокеты.

Ответ №1

Принятый ответ не работает с Socket.IO на устройствах iOS.

Последняя версия Socket.IO-Client-Swift (15.0.0 на момент написания статьи) использует Starscream для WebSockets на iOS/OS X.

Хорошей новостью является то, что Starscream поддерживает прокси SOCKS, однако:

  1. Socket.IO не предоставляет веб-сокет Starscream и не предоставляет API для включения режима прокси SOCKS.

  2. Прокси-сервер SOCKS, встроенный в Starscream, использует настройки прокси-сервера SOCKS, которые громоздки в настройке (по крайней мере, для iOS).

Если у меня будет какое-то время, я мог бы предложить PR для более тщательного решения этой проблемы, но, учитывая, что он требует работы и для Starscream, и для Socket.IO-Client-Swift, это не совсем просто.

Самый простой способ обойти это во временных отладочных целях (что является примером использования для Charles!) – это отредактировать файл WebSocket.swift как часть Starscream и заменить этот код:

if enableSOCKSProxy {
let proxyDict = CFNetworkCopySystemProxySettings()
let socksConfig = CFDictionaryCreateMutableCopy(nil, 0, proxyDict!.takeRetainedValue())
let propertyKey = CFStreamPropertyKey(rawValue: kCFStreamPropertySOCKSProxy)
CFWriteStreamSetProperty(outputStream, propertyKey, socksConfig)
CFReadStreamSetProperty(inputStream, propertyKey, socksConfig)
}

с этим кодом:

let socksConfig = CFDictionaryCreateMutableCopy(nil, 0, CFNetworkCopySystemProxySettings()!.takeRetainedValue()) as! [String: Any]
let propertyKey = CFStreamPropertyKey(rawValue: kCFStreamPropertySOCKSProxy)
let ip = socksConfig["HTTPSProxy"]
let proxySocksConfig = ["SOCKSProxy": ip, "SOCKSPort": 8889, "SOCKSEnable": true] as CFDictionary // Where 8889 is the SOCKS proxy port in Charles
CFWriteStreamSetProperty(outputStream, propertyKey, proxySocksConfig)
CFReadStreamSetProperty(inputStream, propertyKey, proxySocksConfig)

Это обеспечит включение прокси-сервера SOCKS по умолчанию и направит весь трафик веб-сокетов через Charles.

Затем необходимо убедиться, что настройки прокси-сервера HTTP настроены в iOS (поскольку один и тот же IP-адрес будет использоваться как для HTTP, так и для SOCKS), прокси-сервер SOCKS включен в Charles, и что порт соответствует порту в приведенном выше коде (по умолчанию) 8889).

Ответ №2

Спасибо за ваш очень очень полезный ответ Джонатан Эллис! Я использую Pusher, и это отлично работает!

Тем не менее, я обнаружил, что socksConfig не всегда содержит действительные данные и не работает или может socksConfig к сбою приложения при извлечении IP- socksConfig оттуда. Так как единственное, что мы получаем оттуда, это IP-адрес localhost, я просто заменил следующее в WebSocket.swift

if enableSOCKSProxy {
let proxyDict = CFNetworkCopySystemProxySettings()
let socksConfig = CFDictionaryCreateMutableCopy(nil, 0, proxyDict!.takeRetainedValue())
let propertyKey = CFStreamPropertyKey(rawValue: kCFStreamPropertySOCKSProxy)
CFWriteStreamSetProperty(outputStream, propertyKey, socksConfig)
CFReadStreamSetProperty(inputStream, propertyKey, socksConfig)
}

с этим:

let propertyKey = CFStreamPropertyKey(rawValue: kCFStreamPropertySOCKSProxy)
let proxySocksConfig = ["SOCKSProxy": "127.0.0.1", "SOCKSPort": 8889, "SOCKSEnable": true] as CFDictionary // Where 8889 is the SOCKS proxy port in Charles
CFWriteStreamSetProperty(outputStream, propertyKey, proxySocksConfig)
CFReadStreamSetProperty(inputStream, propertyKey, proxySocksConfig)

А затем включил прокси-носки в Чарльзе, как вы описали.

Еще раз спасибо!

Оцените статью
TechArks.Ru
Добавить комментарий