OpenHarmony开发者论坛

标题: 使用Charles 抓包,调试axios网络请求 [打印本页]

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

(, 下载次数: 36)


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




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


(, 下载次数: 41)

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

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

(, 下载次数: 30)

使用@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
(, 下载次数: 38)

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

设置代理:
1.    点击Proxy -->  SSLProxy Settings在include添加*.*和*.443
(, 下载次数: 41)

2.    点击Proxy -->  ProxySettings 勾选Enable transparent HTTP proxying
(, 下载次数: 33)

随后再次请求,设置代理和根证书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下)
复制代码
(, 下载次数: 31)



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



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

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







作者: battier    时间: 2023-12-13 09:34
调试非常需要,感谢感谢!!
作者: songxing10000    时间: 2023-12-16 11:10
mac M1 模拟器抓不了啊,没有真机
作者: songxing10000    时间: 2023-12-16 11:36
用什么代码把
  1. $rawfile('charles.pem')
复制代码
拷贝到filesDir下啊
作者: songxing10000    时间: 2023-12-16 12:36
回复 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
回复 songxing10000: 再去加载这个pem,也还是没法查看请求,不知道是不是要把模拟器上的用户 任凭的证书移到到系统信任那一列去,但是又不知道怎么移动

作者: 马迪    时间: 2023-12-17 08:29
回复 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.   }
复制代码

作者: 马迪    时间: 2023-12-17 08:31
回复 songxing10000: 主要是把charles证书和网站证书,通过capath传递过去
作者: songxing10000    时间: 2023-12-17 14:09
回复 马迪: 报错: {"code":2300060,"message":"SSL peer certificate or SSH remote key was not OK"}
我环境是mac M1模拟器,HarmonyOS 3.1.0(API 9),是不是得用真机才行或者得用API 10才行啊
作者: 马迪    时间: 2023-12-17 21:12
回复 songxing10000: 查了下,底层网络子系统http的usingProxy确实是API10才有的

我也是在API10上验证的
作者: songxing10000    时间: 2023-12-18 09:45
回复 马迪: 原来如此
作者: xiongzhen    时间: 2024-1-20 15:55
也可以试试whistle,基于Node的一个抓包工具。




欢迎光临 OpenHarmony开发者论坛 (https://forums.openharmony.cn/) Powered by Discuz! X3.5