安全研究必备技能 · 从基础概念到实战操作
📋 本文导读
✅ HTTPS、公钥、私钥、证书这些基础概念
✅ 三种方法将抓包证书安装到系统目录
✅ SSL Pinning 的工作原理详解
✅ 使用 Objection 和 Frida 绕过 SSL Pinning
🔐 前置概念学习
在学习抓包限制绕过之前,首先需要明白几个核心概念:HTTPS、公钥、私钥、签名、证书(CA)。
HTTPS 是什么?
HTTPS = HTTP + 加密 + 认证 + 完整性保护
简单来说,HTTPS 就是在 HTTP 的基础上增加了三层保护:
- 数据加密 - 传输内容不会被窃取
- 身份认证 - 确认你连接的是真实的服务器
- 完整性保护 - 数据在传输中不会被篡改
公钥与私钥
公钥私钥用于非对称加密算法(如 RSA、SM4 等),特点是双向加解密:
- 公钥加密 → 私钥解密
- 私钥加密(签名) → 公钥解密
💡 记住:公钥是公开的,任何人都可以获取。私钥只存放于后端,绝对不能泄露。
CA 证书
CA 证书是由权威证书颁发机构发布的数字证书,包含:
- 电子签证机关的信息
- 公钥用户信息
- 公钥
- 签名和有效期
签名是指:用 hash 散列函数计算明文信息的摘要,然后用 CA 的私钥进行加密,加密后的密文就是签名。
证书 = 公钥 + 签名 + 申请者和颁发者信息
客户端操作系统预置了 CA 的公钥,所以可以解密签名来验证证书的真实性。
📦 常规抓包实现原理
理解了上面的原理后,我们来看看常规抓包的思路:为什么使用 BurpSuite、Fiddler 等抓包工具时,只需要将工具的 CA 证书导入到系统信任列表中即可抓包?
抓包的本质就是中间人攻击(MITM):
- 客户端与抓包工具建立 SSL 连接
- 抓包工具与服务器建立 SSL 连接
- 抓包工具在中间解密并转发数据
⚠️ 这一切的前提是:客户端信任抓包工具的证书
📱 安卓导入抓包证书的三种方法
从 Android 7.0 开始,系统不再信任用户自己安装的证书,需要将证书安装到系统证书目录才能生效。
1 手工将证书移入系统目录
这是最原始但可靠的方法:
步骤 1:从 BurpSuite 导出证书
在 BurpSuite 中导出 certificate.der 格式的证书
步骤 2:转换为 PEM 格式并计算 hash
bash
# 转换为 PEM 格式
openssl x509 -in certificate.der -inform DER -out certificate.pem -outform PEM
# 提取 hash
openssl x509 -inform PEM -subject_hash -in certificate.pem | head -1
假设输出的 hash 是 9a5ba575,那么重命名文件:
bash
cat certificate.pem > 9a5ba575.0
openssl x509 -inform PEM -text -in certificate.pem -out /dev/null >> 9a5ba575.0
步骤 3:推送到手机并移动到系统目录
bash
# 先推送到临时目录
adb push 9a5ba575.0 /data/local/tmp/
# 进入 adb shell 操作
adb shell
su
mount -o rw,remount /system
mv /data/local/tmp/9a5ba575.0 /system/etc/security/cacerts/
chmod 644 /system/etc/security/cacerts/9a5ba575.0
⚠️ 如果遇到只读文件系统错误:
bash
# 方法一:重新挂载
mount -o rw,remount /system
# 方法二:如果是 AVB 2.0
adb root
adb disable-verity
adb reboot
# 重启后再次操作
最后:重启手机,查看证书是否安装成功。
2 先安装到用户证书,再手动移动
这是更简单的方法:
- 正常安装证书到用户目录(手机设置中安装)
- 使用 MT 管理器等文件管理器
- 将
/data/misc/user/0/cacerts-added/下的证书文件 - 移动到
/system/etc/security/cacerts/ - 重启手机即可
3 使用 Magisk 模块 Move Certificates
这是最方便的方法,适合经常需要抓包的同学:
- 安装 Fox's Magisk 模块管理工具
- 下载 Move Certificates 模块的 zip 安装包
- 在 Magisk 中导入安装模块
- 手动安装抓包工具证书到用户证书
- 重启手机,模块会自动将用户证书移动到系统目录

✅ 推荐:这是最省心的方法,每次安装新证书后重启即可自动移动。
🛡️ SSL Pinning 原理及绕过
搞定了基础抓包后,你会发现很多 APP 还是抓不到包。这就是因为开启了SSL Pinning(证书锁定)。
什么是 SSL Pinning?
SSL Pinning 顾名思义就是将服务器提供的 SSL/TLS 证书内置到 APP 客户端中,当客户端发起请求时,通过比对内置的证书和服务器端证书的内容,以确定这个连接的合法性。
简单说:APP 只信任自己内置的证书,不信任系统证书列表中的证书,所以抓包工具的证书就不被信任了。
两种锁定方式
| 方式 | 说明 | 特点 |
|---|---|---|
| 证书锁定 | 将服务器证书的哈希或公钥直接内置到 APP 中 | 简单直接,但证书更新需要发版 |
| 公钥锁定 | 只锁定证书中的公钥,比对公钥值 | 公钥不变的话证书续期不用改代码 |

SSL Pinning 的实现方式
1. 代码层实现(以 OkHttp 为例)
直接在代码中校验证书公钥:

2. 配置文件实现(network_security_config)
通过 res/xml/network_security_config.xml 配置 SSL Pinning:
- 使用证书锁定:将证书哈希写入配置
- 使用公钥锁定:提取公钥哈希写入配置
这种方式是目前最常见的实现方式。

🎯 实战:SSL Pinning 绕过演示
我们使用测试 APP 来演示 SSL Pinning 的效果和绕过过程:
测试 SSL Pinning 是否生效
打开测试 APP,点击相关按钮,使用 Charles 抓包:

可以看到提示:
Client closed the connection before a request was made. Possibly the SSL certificate was rejected
这说明 SSL Pinning 生效了,APP 拒绝了我们抓包工具的证书。
绕过方法一:使用 Objection 一键绕过
Objection 是基于 Frida 的强大工具,可以一键绕过 SSL Pinning。
命令:
bash
# 启动 Objection 并注入目标 APP
objection -g com.actorn.netcapture explore
# 在 Objection 中执行
android sslpinning disable

执行后,再次点击 APP 中的按钮,就可以成功抓到 HTTPS 请求包了!

✅ 优点:简单快速,一键搞定。
❌ 缺点:可能有个别 APP 的自定义 SSL Pinning 无法被检测到。
绕过方法二:使用 Frida 自己写 Hook 脚本
如果 Objection 的通用脚本不起作用,就需要自己写针对性的 Frida 脚本。
绕过代码层检测公钥:
bash
console.log("[*] Starting SSL Pinning bypass");
Java.perform(function () {
var ss = Java.use("okhttp3.OkHttpClient$Builder");
ss.proxy.implementation = function (x) {
console.log("[+] Hooked proxy setting");
return this.proxy(null);
}
});

加载脚本并执行:
bash
frida -U -f com.actorn.netcapture -l unpin.js --no-pause

绕过配置文件校验:

执行后,同样可以成功抓包:

绕过方法三:JustTrustMe / JustTrustMePlus
这是专门的 Xposed / LSPosed 模块:
- 在 LSPosed 中安装 JustTrustMe 模块
- 选择作用域为目标 APP
- 重启 APP 即可自动绕过
原理:Hook 了系统所有的 SSL 相关校验方法,让它们永远返回验证通过。
📝 本篇总结
核心要点
基础概念:理解 HTTPS、证书、公钥私钥是抓包的基础
证书安装:Android 7.0+ 需要安装到系统证书目录,推荐使用 Magisk 模块
SSL Pinning:是最常见的反抓包手段,将证书/公钥内置到 APP 中
绕过方法:Objection 一键绕过,或自定义 Frida 脚本,或使用 JustTrustMe 模块
📢 这只是抓包的入门篇。下一篇我们将继续讲解更复杂的抓包限制绕过:双向认证、NO_PROXY、VPN 检测等进阶技术!
🔗 推荐阅读
- Frida 官方文档 - https://frida.re/docs/home/
- Objection GitHub - https://github.com/sensepost/objection
- JustTrustMe GitHub - https://github.com/Fuzion24/JustTrustMe