Saltar al contenido

Cómo inspeccionar el tráfico de websocket con charlesproxy para simulador / dispositivos iOS

Solución:

Finalmente encontré la respuesta.

Charles 3.11.2 funciona perfectamente con WebSocket.

Yo uso socketIO, así que ya he visto solicitudes http enviadas durante la fase de negociación, pero Extrañaba el tráfico de websockets.

Al principio, socketIO intenta usar votación luego cambia para usar websockets.

El tráfico de websocket es visible cuando accede a la solicitud con estado: “Enviando cuerpo de solicitud” que es en realidad wss: // solicitud.

Incluso tienes una pestaña dedicada para este tipo de tráfico. El resto de mensajes aparecerán allí mismo.

ingrese la descripción de la imagen aquí

PS1. Asegúrese de estar conectado al enchufe correctamente, luego aparecerá en Charles.
PS2. Sugiero que usar socketIO es una gran mejora para el tráfico full-duplex como websockets.

ACTUALIZAR: Aparentemente, socket.io-client-swift v15.1.0 ahora admite correctamente el proxy SOCKS. Todavía no lo he probado, pero significaría que estas ediciones manuales de Starscream ya no son necesarias.


La respuesta aceptada no parece funcionar con Socket.IO en dispositivos iOS.

La última versión de Socket.IO-Client-Swift (15.0.0 al momento de escribir este artículo) usa Starscream para WebSockets en iOS / OS X.

Sin embargo, la buena noticia es que Starscream admite el proxy SOCKS:

  1. Socket.IO no expone el websocket de Starscream ni proporciona ninguna API para habilitar el comportamiento de proxy SOCKS.

  2. El proxy SOCKS integrado en Starscream utiliza la configuración del proxy OS SOCKS, que es engorrosa de configurar (al menos para iOS).

Si tengo algo de tiempo, podría proponer un PR para abordar esto más a fondo, pero dado que requiere trabajo tanto para Starscream como para Socket.IO-Client-Swift, esto no es del todo sencillo.

La forma más fácil de solucionar esto con fines de depuración temporal (¡que es el caso de uso de Charles!), Es editar el WebSocket.swift archivo como parte de Starscream y reemplace este código:

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)
}

con este código:

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)

Esto asegurará que el proxy SOCKS esté habilitado de forma predeterminada y enrutará todo el tráfico de websockets a través de Charles.

Luego debe asegurarse de que la configuración del proxy HTTP esté configurada en iOS (ya que se usará la misma IP para HTTP y SOCKS), que el proxy SOCKS esté habilitado en Charles y que el puerto coincida con el puerto en el código anterior (por defecto 8889).

¡Gracias por tu muy útil respuesta, Jonathan Ellis! ¡Estoy usando Pusher y esto funcionó muy bien!

Sin embargo, encontré socksConfig para no contener siempre datos válidos y no funcionó o bloquearía la aplicación cuando saqué la IP de allí. Dado que lo único que obtenemos de allí es la IP del host local, acabo de reemplazar lo siguiente en 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)
}

con este:

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)

Y luego habilitó el proxy de calcetines en Charles como lo describió.

¡Gracias de nuevo!

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *