Я хотел бы проверить сетевой трафик через веб-сокеты, у меня нет контроля над сетевым кодом, поскольку это двоичная библиотека, для которой у меня нет исходного кода, поэтому Я не могу сделать log/breakpoint в сетевой части кода.
Я пробовал использовать последнюю версию CharlesProxy, которая утверждает, что может обнюхать веб-сайты, но когда я попытался использовать url и apis с помощью веб-сокетов, не упоминалось даже в списке конечных точек, вызываемых с моего iPhone.
Я проверил, что CharlesProxy настроен правильно, поскольку я могу проверять трафик не-websocket даже под SSL.
Итак, мой вопрос: кто-нибудь нашел решение для проверки трафика, проходящего через websockets с помощью CharlesProxy?
Примечание. У меня отключена ATS при использовании iOS9
Спасибо!
Я наконец нашел ответ.
Charles 3.11.2 отлично работает с WebSocket.
Я использую socketIO, поэтому я уже видел запросы http, отправленные на этапе согласования, но пропустил трафик websockets.
Вначале socketIO пытается использовать опрос, а затем переключается на использование веб-сокетов.
Трафик веб-сокета виден, когда вы переходите к запросу со статусом: “Тело отправки запроса”, которое на самом деле является запросом wss://.
У вас даже есть выделенная вкладка для этого вида трафика. Остальные сообщения появятся прямо там.
PS1. Убедитесь, что вы правильно подключены к сокету, тогда он появится в Charles.
PS2. Я предлагаю использовать socketIO – это отличное улучшение для полнодуплексного трафика, такого как веб-сокеты.
Принятый ответ не работает с Socket.IO на устройствах iOS.
Последняя версия Socket.IO-Client-Swift (15.0.0 на момент написания статьи) использует Starscream для WebSockets на iOS/OS X.
Хорошей новостью является то, что Starscream поддерживает прокси SOCKS, однако:
-
Socket.IO не предоставляет веб-сокет Starscream и не предоставляет API для включения режима прокси SOCKS.
-
Прокси-сервер 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).
Спасибо за ваш очень очень полезный ответ Джонатан Эллис! Я использую 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)
А затем включил прокси-носки в Чарльзе, как вы описали.
Еще раз спасибо!