解决Charles安装完证书抓不到包乱码问题

解决Charles安装完证书抓不到包乱码问题

环境:android12(红米、已root)、MacOS

问题

Charles按照教程安装完证书,配置完SSL代理后开始抓包。
请添加图片描述
http的包抓取成功,https抓到的包都是乱码没有解析的。提示:Client SSL handshake failed: An unknown issue occurred processing the certificate(certificate_unknown)。
在这里插入图片描述

经过查询发现,安卓7.0及以上系统对于证书的安全策略做了修改,用户证书只能用于代理浏览器的流量,而应用是不会信任这些证书。

解决方案

1、将用户证书导入系统证书。

2、把app项目设置默认信任所有证书(系统+用户)。

这里直接使用方案一。

大致步骤是通过 adb root 和 adb remount 将用户证书直接复制进 /system/etc/security/cacerts/ 路径。

adb root  #获取root权限
adb disable-verity #关闭检测功能
adb reboot #关闭检测之后需要重启机器
#重启机器成功之后:
adb root  #再次获取root权限
adb remount  #重启挂载system分区为可读写分区
adb shell
cp <cert>.0 /system/etc/security/cacerts/

或者

adb shell
su
mount -o remount, rw /system #挂载system分区为可读写分区
cp <cert> .0 /system/etc/security/cacerts/
具体实践
方法一

第一步 adb root 就出问题了。

adb root

在这里插入图片描述

尝试安装超级 adbd(adbd-insecure.apk)。

下载地址:https://forum.xda-developers.com/t/2014-11-10-root-adbd-insecure-v2-00.1687590/

安装完成后需要将Enable insecure adbd 和 Enable at boot 勾选上。

然而点击 Enable insecure adbd 选项框会报错。可能是安卓版本太高了的原因。

再尝试网上文章说的安装 magisk 模块 adb_root。

下载地址:https://github.com/evdenis/adb_root

在这里插入图片描述

根据步骤下载zip,adb push到手机后,在magisk上选择本地安装。安装成功后,重启手机。结果还是不行。

方法二

经过百度谷歌了很久后实在找不到方法了,放弃第一种方法,打算通过adb shell后再挂载分区。

挂载时报错:找不到 /system。

在这里插入图片描述

查询后发现原因是在Android8.0以上通过以上mount命令,你会发现找不到/system代表的节点和拥有的权限信息,这是因为Android8.0之后谷歌加入了A/B system的特性,system分区跟ramdisk分区打包在一起,因此系统起来之后也就不存在system分区了,而是直接把system镜像挂载到/根目录上。所以/proc/mounts文件中没有包含/system的权限信息。

需要使用

mount -o remount -o rw /

然而还是不行。

根据他的解释,当然上面方法不能挂载/system目录的话而且提示“’/dev/root’ is read-only”的话,那么是因为你的设备开启了avb,此时就只能通过下面的方式完全重新挂载整个系统:

adb root
adb disable-verity
adb remount

绕了一圈又回到了原点。

参考:https://blog.csdn.net/baidu_38661691/article/details/107481148

之后又尝试用 mt管理器和 fx管理器挂载,结果都没成功。

方法三

经过寻找在git上发现一种方法:通过Magisk模块,将文件放到/system目录下。

1、准备证书

​ Charles导出证书 Charles -> Help -> SSL Proxying -> save Charles root certificate

2、转换证书

为什么算了两个哈希值,好像是根据机型不同,需要用到的哈希算法不同。

# 获取文件名
openssl x509 -inform PEM -subject_hash_old -in charles-ssl-proxying-certificate.pem | head -1 #aaaaaaaa
openssl x509 -inform PEM -subject_hash -in charles-ssl-proxying-certificate.pem | head -1  #bbbbbbbb

# 分别使用上面的文件名,注意后缀
openssl x509 -inform PEM -text -in charles-ssl-proxying-certificate.pem > aaaaaaaa.0
openssl x509 -inform PEM -text -in charles-ssl-proxying-certificate.pem > bbbbbbbb.0

3、编辑输出的文件,把 -----BEGIN CERTIFICATE----- 到文·件结束这部分移动到文件首部

4、制作Magisk模块

模块文件结构为:

charles_ca
├── META-INF
│   └── com
│       └── google
│           └── android
│               ├── update-binary
│               └── updater-script
├── module.prop
└── system
    └── etc
        └── security
            └── cacerts
                ├── aaaaaaaa.0
                └── bbbbbbbb.0

下载项目,解压后把前面转换好的文件移动到 system/etc/security/cacerts 下面,替换 aaaaaaaa.0 和 bbbbbbbb.0。然后压缩成zip。

关于模块中的system目录,根据 https://topjohnwu.github.io/Magisk/guides.html#magisk-module-installer 上面的解释,/system路径下的文件可以添加到手机中相同路径下的文件夹内或者直接替换。

在这里插入图片描述

5、安装模块

adb push 将zip包推到手机里,magisk点击本地安装,成功后就可以抓包了。

注意

制作模块时遇到了一个坑,我把charles_ca文件夹直接压缩成zip。然后在magisk中安装的时候直接报错了。

在这里插入图片描述

然后我观察了一下其他模块的安装包,对比了自己的,发现压缩时应该直接把META-INF、module.prop、system三个文件压缩,不能外面加一个文件夹。

参考:https://github.com/DabanC/android_install_ca_certificate、https://www.jianshu.com/p/06ccefcdbcd2

<think>嗯,用户问的是Charles抓包WSS数据乱码问题。首先,我需要回忆一下Charles的工作原理。Charles是一个中间人代理,可以拦截和记录HTTP/HTTPS流量。但WSS是WebSocket Secure,也就是加密的WebSocket,和HTTPS类似,使用TLS加密。所以,如果用户直接抓包WSS,数据应该是加密的,显示乱码。 那用户为什么会看到乱码呢?可能的原因有几个。首先,用户是否在Charles安装了SSL证书?如果没有正确安装证书Charles无法解密HTTPS流量,自然WSS的数据也无法解密,导致乱码。其次,即使安装证书,可能需要配置Charles来解密WebSocket流量。因为WebSocket和普通的HTTPS请求不同,可能需要额外的设置。 接下来,我需要考虑解决步骤。第一步肯定是确保Charles的SSL证书已经正确安装括客户端和移动端(如果使用手机抓包)。然后,检查Charles的SSL代理设置是否含目标域名,确保它被添加到SSL代理列表中。另外,WebSocket的连接是通过HTTP升级来的,所以可能需要监控正确的端口,通常是443,但有时也可能是其他端口,需要确认。 另外,用户可能需要开启WebSocket的具体配置。在Charles中,默认可能不会自动解析WebSocket内容,需要手动启用。例如,在Charles的Proxy设置里,可能有WebSocket的选项需要勾选,或者需要右键点击特定的WebSocket连接,选择“Enable SSL Proxying”或类似的选项。 还有一个可能,是应用程序本身使用了证书固定(Certificate Pinning),这样即使安装Charles证书,应用也会拒绝连接,导致无法解密。这种情况下,用户可能需要绕过证书固定,但这通常比较复杂,可能需要修改应用或使用越狱设备。 此外,用户可能没有正确配置客户端的代理设置,导致流量没有经过Charles,或者防火墙/杀毒软件拦截了连接。需要检查网络设置是否正确,确保设备信任了Charles证书。 最后,如果所有设置都正确,但数据还是乱码,可能需要检查是否是非文本数据,比如二进制数据,这时候即使解密了,也可能显示乱码。这时可以尝试查看数据的格式,或者使用Charles的导出功能保存下来用其他工具分析。 总结下来,回答需要分步骤引导用户检查证书安装、SSL代理配置、WebSocket设置、证书固定等问题,并提供具体的操作路径,比如如何在Charles中启用SSL代理,如何添加域名到SSL列表,如何处理证书固定等。同时,提醒用户注意数据格式可能导致的显示问题。这样用户能逐步排查问题所在,解决乱码的情况。</think>Charles抓包出现WSS数据乱码解决方案如下: 一、问题根源 WSS(WebSocket Secure)本质是加密的WebSocket协议,其数据通过TLS加密传输。若未正确配置Charles抓包结果会显示乱码。 二、分步解决指南 1. 安装证书(必须步骤) - 电脑端:Charles > Help > SSL Proxying > Install Charles Root Certificate - 手机端:访问chls.pro/ssl下载证书后手动安装 - 注意:iOS需在设置中启用全信任,Android需在安全设置中启用 2. 配置SSL代理 - 打开Charles > Proxy > SSL Proxying Settings - 添加新条目:Host填*,Port填443(或具体业务端口) - 勾选"Enable SSL Proxying" 3. WebSocket专用配置 - 右键目标WebSocket连接 - 选择"Enable WebSocket"选项 - 在WebSocket消息窗口勾选"SSL"选项 4. 检查证书锁定(进阶问题) - 部分应用使用证书锁定(certificate pinning) - 解决方案:需使用逆向工具绕过(如Frida/Objection),或联系开发人员禁用该功能 5. 验证配置效果 - 正确配置后,WebSocket消息应显示为明文JSON/XML等格式 - 错误示例:仍显示"TLS Application Data"或乱码 - 正确示例:显示可读的请求/响应内容 三、常见错误排查 1. 证书未信任:手机/电脑系统未全信任Charles证书 2. 代理未生效:检查设备代理设置是否指向Charles(默认8888端口) 3. 协议不兼容:部分私有协议需特殊解析器(需定制开发) 4. 防火墙拦截:临时关闭防火墙测试 四、数据格式说明 即使解密成功,以下情况可能显示"类乱码": - Protobuf二进制数据:需使用protoc工具解码 - 自定义二进制协议:需开发对应解析器 - 压缩数据:尝试在Charles中启用"Decompress GZIP"选项 建议通过对比浏览器开发者工具中的WebSocket数据,验证抓包结果的准确性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值