Flutter不支持Charles抓包?

2024-07-16  本文已影响0人  老P打码

实际问题场景描述

使用dio框架发起的网络请求,手机上都配置好一切后,Charles却没法抓到包。

问题分析

需要知识储备:https的ssl加密实现、charles抓https包的原理

问题原因

  1. Flutter应用中常用的HTTP客户端库(如Dio或http)是独立使用Dart语言的HTTP实现,未直接使用系统级的网络堆栈,所以它们不会自动继承系统代理配置,因此系统上的代理配置无法生效。
  2. 在Dart/Flutter中,也就是框架层面,默认的HTTP客户端不信任自签名证书,网络库(如Dio或http)层继承了这个默认配置。

问题解决

需在dart代码内,手动指定代理ip和端口。(可以自己写一个简单的小页面,来配置代理,指定代理端口和ip)
如果使用的是dio库,如下

dio!.httpClientAdapter = IOHttpClientAdapter(
  createHttpClient: () {
    final client =
        HttpClient(context: SecurityContext(withTrustedRoots: false));
    client.findProxy = (uri) {
      return 'PROXY $proxyIp:$proxyPort'; // proxyIp: 代理ip,proxyPort:代理端口
    };
    client.badCertificateCallback =
        (X509Certificate cert, String host, int port) => true; // 允许自签名证书
    return client;
  },
);

如果使用的是Http库,如下

HttpClient client = HttpClient();
client.findProxy = (uri) {
  return "PROXY $proxyIp:$proxyPort"; // proxyIp: 代理ip,proxyPort:代理端口
};
client.badCertificateCallback = (X509Certificate cert, String host, int port) => true;  // // 允许自签名证书

提问

为什么Flutter的dio不支持类似安卓/iOS原生应用一样直接被抓包?
总结:
上一篇 下一篇

猜你喜欢

热点阅读