我正在使用 Charles Proxy 检查来自 Android 应用的流量。我已将手机配置为通过安装在我电脑上的 Charles 代理所有流量。
到目前为止,除了 websocket 流量外,所有功能均正常(HTTP/HTTPS 流量)。我无法在 Charles 和 Fiddler 中检查它。首先,CONNECT 请求失败,如下所示:
URL https://184.73.XX.XX/
Status Failed
Failure Invalid first line in request
Response Code -
Protocol HTTP/1.0
Method CONNECT
Content-Type -
Client Address /192.168.0.10
Remote Address 184.73.XX.XX/184.73.XX.XX
在该请求之后,立即发送了一个额外的请求来升级连接,从响应中可以看出该请求似乎成功了:
HTTP/1.1 101 Switching Protocols
Server: nginx
Date: Sun, 16 Feb 2014 02:04:33 GMT
Connection: upgrade
Upgrade: websocket
Sec-WebSocket-Accept: CKm+rgmiltNrbQvwU2HzKHzr2eM=
此后,即使活动继续,应用程序的流量也会停止出现。那么,为什么代理无法捕获 websocket 流量呢?此外,我如何捕获它以查看来回发送的内容?
我尝试过 Wireshark,看到 TLS 流量在 CONNECT/升级请求后继续,但我不知道如何将数据包重建为可以理解的内容,以及如何解密 TLS 加密流量。
答案1
如果有人感兴趣的话,我自己找到了答案(来源是 blogs.telerik.com)
WebSockets
Fiddler 对 HTML5 WebSockets 的支持不断增强;Fiddler 扩展现在可以通过处理 FiddlerApplication.OnWebSocketMessage 事件来捕获和操作 WebSocket 消息。
为了准备功能齐全的 WebSockets UI,Fiddler 不再向 Log 选项卡发送 WebSocket 消息。如果您想在完整 UI 可用之前重新启用该行为,可以使用 FiddlerScript 来实现。只需单击规则 > 自定义规则,然后在 Handlers 类中添加以下函数即可。
static function OnWebSocketMessage(oMsg: WebSocketMessage) {
// Log Message to the LOG tab
FiddlerApplication.Log.LogString(oMsg.ToString());
/*
// Modify a message's content
var sPayload = oMsg.PayloadAsString();
if (sPayload.Contains("time")) {
oMsg.SetPayload(sPayload + "... bazinga!");
}
*/
}