鸿蒙-使用Charles抓包

目录

    • 前言
    • 鸿蒙应用中的网络请求
      • rcp 抓包
      • http 抓包
    • 以下是排查过程,没啥参考价值
      • 发送文件
      • http 抓包报错

前言

抓包,对于各位开发者应该不陌生,各种抓包工具应该的都听说过,像 charles、fiddler、Wireshark‌等。在 Android 和 iOS 上抓包都挺简单的,把证书存放到手机上,然后安装一下,网络设置里面配置一下代理,代码里面忽略一下证书校验或者信任一下用户证书就好了。
但在鸿蒙手机上,似乎第一步把证书存放到手机上就卡住了一部分人。

鸿蒙应用中的网络请求

在开发文档中有提到两种网络请求的方法,一开始是用 http,再后来推荐使用 rcp。现在上架的应用估计大部分是用的 http 或者axios 这个封装好的框架进行的网络请求。

rcp 抓包

在官方文档中,并没有找到http 如何忽略证书校验或者信任用户证书,只翻到了如何使用自定义证书。
嘿嘿,问题不大,因为我们用的是 rcp 做的网络请求,自己封装了一下。并且在官方文档中找到了跳过证书校验的配置:

SecurityConfiguration接口允许开发人员在会话中配置与安全相关的设置,包括证书和服务器身份验证。

其中有个属性:remoteValidation,解释说明是证书颁发机构(CA),用于验证远程服务器的身份。默认值为’system’。
我们可以配置的类型有:"system""skip"CertificateAuthorityValidationCallback,其中默认值为’system’。
如果未设置此字段,系统CA将被用于验证远程服务器的标识。
‘system’:表示使用系统CA配置。
‘skip’:跳过验证。
CertificateAuthority:证书颁发机构(CA)验证。
ValidationCallback:自定义证书校验。

这不就简单了么,整个 demo 试一下

        Button('charles抓包 rcp').onClick((_)=>{const session = rcp.createSession();const request = new rcp.Request('https:/xxxxxx','GET');request.configuration = {security: {remoteValidation: 'skip',},};session.fetch(request).then((rep: rcp.Response) => {console.info(`Response succeeded: ${rep}`);}).catch((err: BusinessError) => {console.error(`Response err: Code is ${err.code}, message is ${err.message}`);});});

打开抓包软件,手机 wifi 设置里面配置一下代理,就可以看到能抓包了,甚至不需要安装证书。

http 抓包

由于没有找到如何忽略证书,就和 Android 抓包一样,先把证书安装到手机上。
在抓包软件中导出证书,注意查看一下证书的有效期,当然安装抓包软件的电脑上也需要安装一下证书,并且需要信任才行。
然后使用hdc file send将证书发送到手机上,问题就在这里,不知道手机的文件夹目录是啥。

hdc file send charles-ssl-proxying-certificate.pem /storage/media/100/local/files/Docs/Download/charles.pem

这里的目标路径为/storage/media/100/local/files/Docs/Download/,也就是我们在手机文件管理里面看到的Download文件夹。这里需要注意的是,需要在后面加目标文件的名字,这也是和Android的adb psuh最大的区别,adb 只需要指定到文件夹就好,相当于把文件复制到这个文件夹中,复制之后的名字可以不指定。
我们可以在 DevEco 的右下角Device File Browser把文件夹展开看一下:

鸿蒙手机文件夹

然后我们打开证书安装页面:hdc shell aa start -a MainAbility -b com.ohos.certmanager ,或者在手机设置–>隐私和安全–>高级–>证书与凭据–>从存储设备安装,点击 CA 证书,会弹出警告弹窗,我们点击继续,找到我们刚才发送到设备的证书,完成安装
在这里插入图片描述

随后撸一坨代码测试一下

        Button('charles抓包 http').onClick((_)=>{let httpRequest = http.createHttp();httpRequest.request(// 填写HTTP请求的URL地址,可以带参数也可以不带参数。URL地址需要开发者自定义。请求的参数可以在extraData中指定"https://xxxxx",{method: http.RequestMethod.GET, // 可选,默认为http.RequestMethod.GET// 开发者根据自身业务需要添加header字段header: {'Content-Type': 'application/x-www-form-urlencoded'},expectDataType: http.HttpDataType.STRING, // 可选,指定返回数据的类型priority: 1, // 可选,默认为1connectTimeout: 60000, // 可选,默认为60000msreadTimeout: 60000, // 可选,默认为60000msusingProxy: true, // 可选,默认不使用网络代理,自API 10开始支持该属性// caPath:filePath}, (err: BusinessError, data: http.HttpResponse) => {if (!err) {// data.result为HTTP响应内容,可根据业务需要进行解析console.info('Result:' + JSON.stringify(data.result));console.info('code:' + JSON.stringify(data.responseCode));// data.header为HTTP响应头,可根据业务需要进行解析console.info('header:' + JSON.stringify(data.header));console.info('cookies:' + JSON.stringify(data.cookies)); // 8+// 当该请求使用完毕时,调用destroy方法主动销毁httpRequest.destroy();} else {console.error('error:' + JSON.stringify(err));// 当该请求使用完毕时,调用destroy方法主动销毁httpRequest.destroy();console.error("flutter 鸿蒙打点:")}});})

同样的操作,熟悉的配方就可以看到抓包结果了。

以下是排查过程,没啥参考价值

发送文件

一开始使用 hdc 发送文件一直失败,一个原因是找不到正确的文件夹,另外一个原因就是没有加指定目标文件的文件名,路径只写到了某个文件夹。
还想尝试使用手机上登录微信,通过微信发送。
蓝牙配对一下,使用蓝牙发送。
电脑上搞个 ftp,手机上访问下载一下。
这些方案应该都能解决文件传输问题,但我就想用 hdc 搞定一下,折腾了好半天,搜了一摞一摞的教程。。。

http 抓包报错

安装完证书,配置好代理之后抓包时发现 http 请求失败,报错2300060 远程服务器SSL证书或SSH秘钥不正确.
刚开始以为是在 http 请求中需求配置点什么属性,比如usingProxy这个属性:可以配置属性值类型boolean或者HttpProxy
首先设置为 true,抓包还是不行。
设置为HttpProxy对象,地址就写电脑的 ip 和抓包软件中设置的对应的端口号,结果还是报错。

然后就以为需要把证书拷贝到沙箱目录,然后走自定义证书那一套流程,结果还是不行,照样是2300060这个错误码。

之后就去翻官方文档,看到有个提示
http_2300060报错提示

然后看了下证书有效期,果然是证书过期了,但奇怪的是在 Android 上可以抓包。解决方案就是在抓包软件里面重置一下证书,再重新导出一下,安装到手机上就可以了。


为啥会关心这两个网络请求抓包:因为有个立项比较早的项目,是由前端主导的,当时还没有 rcp,于是选择了axios。后面又立项了另外一个项目,是客户端主导的,并且这时候官方文档也开始推荐使用 rcp 了。


以上

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/78750.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

回顾|Apache Cloudberry™ (Incubating) Meetup·2025 杭州站

2025 年 4 月 19 日,由酷克数据与中启乘数联合举办的 Apache Cloudberry™ (Incubating) Meetup 杭州站在浙江省杭州市滨江区滨江会展中心成功举办。本次活动邀请了 Cloudberry PPMC 团队成员、活跃内核贡献者以及中兴 EBASE-A、阿里云 ADB-PG、网易、中启乘数等多…

Linux网络编程 深入Linux网络栈:原始套接字链路层实战解析

之前我们编程都是在应用层,只需在地址结构体中传 地址与端口号。然后协议栈在传输层,与网络层帮我们进行数据的封装。但这里我们要学的是在链路层进行编程 这里我想说一下,当数据到达链路层,有三个分支:ARP&#xff0c…

用python写一个相机选型的简易程序

最近有点忙,上来写的时间不多。 今天就把之前写的一个选型的简易程序,供大家参考。 代码: import sys from PyQt5.QtWidgets import (QApplication, QMainWindow, QWidget, QVBoxLayout, QHBoxLayout,QLabel, QLineEdit, QPushButton, QGro…

【实战篇】数字化打印——打印格式设计器的功能说明

前言 myBuilder内置了覆盖丰富场景的打印格式设计器,效果统一,功能完善。 设计器一:小票 用于设计小票、水单等滚筒纸张的场景,例如:超市购物小票 主要功能 打印格式的保存、下载、上传设计时功能:撤销…

Qt 中 QSQLITE 和 QODBC 数据库连接的区别

Qt 中 QSQLITE 和 QODBC 数据库连接的区别 这两行代码都是创建 Qt 数据库连接,但使用了不同的数据库驱动和连接方式: 1. QSqlDatabase::addDatabase("QSQLITE") 特点: 使用 SQLite 数据库的 原生驱动直接与 SQLite 数据库文件(…

Eigen核心矩阵/向量类 (Matrix, Vector, Array)

1. Matrix 类&#xff08;稠密矩阵&#xff09; 模板参数 cpp Matrix<Scalar, Rows, Cols, Options, MaxRows, MaxCols> Scalar: 元素类型&#xff08;如 float, double, int&#xff09;。 Rows/Cols: 行数和列数&#xff08;Dynamic 表示动态大小&#xff09;。 O…

汽车免拆诊断案例 | 2016款奔驰C200L车组合仪表上多个故障灯偶尔点亮

故障现象 一辆2016款奔驰C200L车&#xff0c;搭载274 920发动机&#xff0c;累计行驶里程约为13万km。该车组合仪表上的防侧滑故障灯、转向助力故障灯、安全气囊故障灯等偶尔异常点亮&#xff0c;且此时将挡位置于R挡&#xff0c;中控显示屏提示“后视摄像头不可用”&#xff…

实现 Babylon.js 鼠标输入管理单例 (MouseController) 的最佳实践

在现代 Web3D 开发中&#xff0c;高效的输入管理是创建流畅交互体验的关键。本文将详细介绍如何在 Babylon.js 中实现一个强大的鼠标输入管理单例&#xff0c;帮助你优雅地处理所有指针事件。 为什么需要鼠标输入管理单例&#xff1f; 在复杂的 3D 场景中&#xff0c;鼠标/指…

【LLM+Code】Cursor Agent 46.11 版本PromptTools最细致解读

一、cursor Agent cursor的agent模式, 多说一句&#xff0c;cursor目前我付费使用&#xff0c;是我目前为止使用过AI coding工具里最喜欢的一个&#xff0c;cursor nb&#xff01; https://gist.github.com/sshh12/25ad2e40529b269a88b80e7cf1c38084version&#xff1a;46.11 …

Flask + ajax上传文件(二)--多文件上传

Flask多文件上传完整教程 本教程将详细介绍如何使用Flask实现多文件上传功能,并使用时间戳为上传文件自动命名,避免文件名冲突。 一、环境准备 确保已安装Python和Flask pip install flask项目结构 flask_upload/ ├── app.py ├── upload/ # 上传文…

多级缓存入门:Caffeine、Lua、OpenResty、Canal

之前写过——Google Guava Cache简介 本文系统学习一下多级缓存 目录 0.什么是多级缓存商品查询业务案例导入1.JVM进程缓存初识Caffeine实现JVM进程缓存2.Lua语法入门HelloWorld数据类型、变量和循环函数、条件控制3.Nginx业务编码实现多级缓存安装OpenRestyOpenResty快速入门…

Python + Playwright:如何在Docker 容器运行测试?

Python + Playwright:如何在Docker 容器运行测试? 前言一、简介二、环境准备1. 安装 DockerWindows 用户macOS 用户Linux 用户(以 Ubuntu 为例)2. 启动 browserless 服务拉取 browserless 镜像启动 browserless 容器验证 browserless 是否启动成功三、创建自动化测试项目1.…

语音合成之四大语言模型(LLM)与TTS的深度融合

基于LLM的语音合成 1.技术架构1.1 LlaSA1.2 CosyVoice (和 CosyVoice2)1.3 SparkTTS 2 特性对比2.1 零样本语音克隆2.2 多语种支持2.3 可控语音生成2.4 计算效率和模型大小 总结 当前&#xff0c;在大型语言模型&#xff08;Large Language Models&#xff0c;LLMs&#xff09;…

使用 Conda 创建新环境

使用 Conda 创建新环境 在使用 Conda 进行包管理和环境隔离时&#xff0c;创建新环境是一个非常常见的操作。通过创建独立的环境&#xff0c;可以避免不同项目之间的依赖冲突&#xff0c;并且能够灵活地管理各个项目的运行环境。 以下是使用 Conda 创建和管理新环境的详细步骤…

Unity AssetBundle (AB) 打包详解

AssetBundle 是 Unity 提供的一种资源打包机制&#xff0c;允许开发者将游戏资源&#xff08;如模型、纹理、预制体等&#xff09;打包成独立的文件&#xff0c;便于动态加载和热更新。 一、AssetBundle 基础概念 1. 什么是 AssetBundle 资源压缩包&#xff0c;包含序列化资源…

Python flask入门

Python flask入门 一、路由1.1 常规路由1.2 动态路由1.3 路由的其他高级用法 二、变量规则2.1 示例1&#xff1a;字符串类型&#xff08;默认&#xff09;2.2 示例2&#xff1a;整数类型2.3 示例3&#xff1a;路径类型 三、自定义转换器3.1 核心组件详解3.2 工作流程详解 四、f…

AI赋能守护行车安全新防线,基于YOLOv5全系列【n/s/m/l/x】参数模型开发构建驾驶车辆场景下驾驶员疲劳分心驾驶行为智能检测预警系统

在当今社会&#xff0c;随着科技生产力的飞速发展&#xff0c;汽车早已成为人们日常出行不可或缺的交通工具。它不仅极大地提高了人们的出行效率&#xff0c;也为生活带来了诸多便利。然而&#xff0c;随着汽车保有量的不断增加&#xff0c;交通安全问题也日益凸显。疲劳驾驶和…

onloyoffice历史版本功能实现,版本恢复功能,编辑器功能实现 springboot+vue2

文章目录 onloyoffice历史版本功能实现&#xff0c;版本恢复功能&#xff0c;编辑器功能实现 springbootvue2前提 需要注意把这个 (改成自己服务器的ip或者域名) 改成 自己服务器的域名或者地址我使用的onloyoffice版本 8.1.3.41. onloyoffice服务器部署 搜索其他文章2. 前段代…

概率论与统计(不确定性分析)主要应用在什么方面?涉及到具体知识是什么?

用户问的是概率论与统计&#xff08;不确定性分析&#xff09;的主要应用方面&#xff0c;涉及的具体知识以及具体公式。首先&#xff0c;我需要确定概率论与统计在哪些领域有应用&#xff0c;比如工程、金融、医学、数据科学等等。然后&#xff0c;具体知识部分应该包括概率论…

如何利用快照与备份快速恢复服务器的数据

在服务器上利用**快照&#xff08;Snapshot&#xff09;**和**备份&#xff08;Backup&#xff09;**快速恢复数据&#xff0c;可显著减少停机时间并确保业务连续性。以下是具体操作步骤和最佳实践&#xff1a; --- ### **1. 快照&#xff08;Snapshot&#xff09;恢复** **适…