• Lv0
    粉丝20

积分1156 / 贡献0

提问0答案被采纳63文章8

[经验分享] 使用Charles 抓包,调试axios网络请求 原创 精华

马迪 显示全部楼层 发表于 2023-12-11 10:03:48
Charles 介绍与抓包原理
在开发OpenHarmony/HarmonyOS应用开发时,我们往往使用@ohos/axios请求服务端。在开发的过程中,我看到很多伙伴使用了Charles来调试与服务器端的网络通讯协议,以及分析网络包的数据,并且收到了很多关于@ohos/axios支持设置代理的issue。
Charles 是在PC端常用的网络封包截取工具,通过将自己设置成系统的网络访问代理服务器,使得所有的网络访问请求都通过它来完成,从而实现了网络封包的截取和分析。
Charles 主要的功能包括:

  • 截取 Http Https 网络封包。
  • 支持重发网络请求,方便后端调试。
  • 支持修改网络请求参数。
  • 支持网络请求的截获并动态修改。
  • 支持模拟慢速网络。

fakename.png


下载安装 Charles
打开浏览器访问 Charles官网 ,下载相应系统的 Charles 安装包,然后安装即可:

  • Windows 运行安装应用程序以在程序菜单中安装 Charles。
  • Mac OS X 通过双击解压缩下载文件,然后将 Charles 应用程序复制到 Applications 目录中。
  • Linux Charles 拥有 APT YUM 存储库,如果你有基于 Debian 或基于 Red Hat 的 Linux 发行版,这是安装 Charles 的首选方法。否则,将 tar.gz 文件解压缩到适当的站点。如果您以前安装过 Charles 并且正在进行升级;首先确保 Charles 没有运行,然后安装或复制在以前安上。通过运行 bin/charles 脚本启动 Charles。




使用Charles,设置代理
启动后,点击ProxyàProxy Setting设置代理端口,如下图设置端口为8888。


fakename.png

通过
  1. curl -x 127.0.0.1:8888 http://www.baidu.com
复制代码

验证代理已经正常启动,并且可以抓到包。

fakename.png

使用@ohos/axios配置代理
@ohos/axios 2.2.0-rc.0及以上版本支持了代理的设置,只需要保证PC和OpenHarmony开发板在同一个局域网下,即可抓到网络请求包:

  1. // 发送一个get请求,使用代理
  2. axios<string, AxiosResponse<string>, null>({
  3.   method: "get",
  4.   url: 'http://www.baidu.com',
  5.   proxy:{
  6.         host: '192.168.1,23',
  7.         port: 8888,
  8.         exclusionList:[]
  9. }
  10. }).then((res: AxiosResponse) => {
  11.   console.info('result:' + JSON.stringify(res.data));
  12. }).catch((error: AxiosError) => {
  13.   console.error(error.message);
  14. })
复制代码



https抓包,CA根证书配置
导出Charles根证书,HelpàSSLProxying -->Save Charles Root Certificate 保存成根证书到桌面Desktop.pem
fakename.png

安装Charles证书到PC系统可信目录,操作步骤:
点击HelpàSSLProxyingàInstall Charles Root Certificateà安装证书

设置代理:
1.    点击Proxy -->  SSLProxy Settings在include添加*.*和*.443
fakename.png

2.    点击Proxy -->  ProxySettings 勾选Enable transparent HTTP proxying
fakename.png

随后再次请求,设置代理和根证书Desktop.pem

  1. // 发送一个get请求,使用代理,并使用CA根证书
  2. axios<string, AxiosResponse<string>, null>({
  3.   method: "get",
  4.   url: 'https://1.94.37.200:8080/user/getUserByUuid?userUuid=1',
  5.   proxy:{
  6.         host: '192.168.1,23',
  7.         port: 8888  ,
  8.         exclusionList:[]
  9. },
  10. caPath: '', //ca证书路径(应用目录getContext().filesDir + "/Desktop.pem"。目前我是把Desktop.pem放到rawfile目录下,在abouttoaperar时先把证书拷贝到filesDir下)
复制代码
fakename.png



PS:如果需要能抓到https接口返回的内容,需要把charles的证书和网站的证书合并(文本文件合并),这样charles显示出返回的数据:
fakename.png



最后
本文主要讲了Charles的代理设置和抓包调试OpenHarmony/HarmonyOS应用,以及最新@ohos/axios网络库设置代理的方法。

除了普通抓包以外,Charles还有mock网络请求,模拟慢速网络的特性,以后肯定会用到。不过这个工具好像只免费30天使用,过段时间再试试用fiddler,wireshark等工具。






©著作权归作者所有,转载或内容合作请联系作者

您尚未登录,无法参与评论,登录后可以:
参与开源共建问题交流
认同或收藏高质量问答
获取积分成为开源共建先驱

精彩评论11

battier

沙发 发表于 2023-12-13 09:34:55
调试非常需要,感谢感谢!!

songxing10000

板凳 发表于 2023-12-16 11:10:19
mac M1 模拟器抓不了啊,没有真机

songxing10000

地板 发表于 2023-12-16 11:36:40
用什么代码把
  1. $rawfile('charles.pem')
复制代码
拷贝到filesDir下啊

songxing10000

发表于 2023-12-16 12:36  IP属地: 四川省成都市

回复 songxing10000: 我是用把pem放桌面,在桌面上开启了http, python -m http.server 8080  然后,

  1. let context = getContext(this) as common.UIAbilityContext;
  2.     let filesDir = context.cacheDir;
  3.     // try {
  4.     //   request.downloadFile(context, {
  5.     //     url: 'http://192.168.101.8:8080/charles.pem',
  6.     //     filePath: filesDir + '/charles.pem'
  7.     //   }).then((downloadTask) => {
  8.     //     downloadTask.on('complete', () => {
  9.     //        console.log("f")
  10.     //     })
  11.     //   }).catch((err) => {
  12.     //     console.error(`Invoke downloadTask failed, code is ${err.code}, message is ${err.message}`);
  13.     //   });
  14.     // } catch (err) {
  15.     //   console.error(`Invoke downloadFile failed, code is ${err.code}, message is ${err.message}`);
  16.     // }
复制代码
把这个文件下载到了cache文件夹

songxing10000

发表于 2023-12-16 12:38  IP属地: 四川省成都市

回复 songxing10000: 再去加载这个pem,也还是没法查看请求,不知道是不是要把模拟器上的用户 任凭的证书移到到系统信任那一列去,但是又不知道怎么移动

马迪

发表于 2023-12-17 08:29  IP属地: 广东省广州市

回复 songxing10000: 我是在启动的时候做了个拷贝,类似下面的代码

  1.   async aboutToAppear(){
  2.     this.caPath = getContext().filesDir + "/Desktop.pem"
  3.     let ca: Uint8Array = await getContext().resourceManager.getRawFileContent("Desktop.pem");
  4.     if (ca != null) {
  5.       let file = fs.openSync(this.caPath, fs.OpenMode.READ_WRITE | fs.OpenMode.CREATE);
  6.       fs.writeSync(file.fd, ca.buffer);
  7.       fs.fsyncSync(file.fd);
  8.       fs.closeSync(file);
  9.       console.info("copycopycopycopycopy");
  10.     }
  11.   }
复制代码

【7 条回复】 查看全部

xiongzhen

5# 发表于 2024-1-20 15:55:55
也可以试试whistle,基于Node的一个抓包工具。
共11 条回复,点击查看

Copyright   ©2023  OpenHarmony开发者论坛  京ICP备2020036654号-3 |技术支持 Discuz!

返回顶部