Fiddler抓取APP端,HTTPS报错全解析及解决方案(一篇解决常见问题)
环境:雷电模拟器Android9系统
你所遇到的fiddler中抓取HTTPS的问题可以分为三类:一类是你自己证书安装上逻辑错误,另一种是APP中使用了“证书固定”的手段。三类fiddler中生成证书时的参数过程。
1.Fiddler证书安装上的逻辑错误
-
更新Options中的选项时,并为对fiddler进行重启。并且安装证书在重启之后
-
未删除以前的证书残留(除非你是全新的环境)
-
android7以上的不支持用户安装凭证,需要手动进行安装。或直接生成为系统凭证
-
Android端的代理设置问题
上述前三种会导致:“提示证书安全有问题”的错误现象
最后一种会导致:“你设置完代理,连接不上网!”
1.1 为什么需要设置Options后,需要重启!
- 在修改HTTPS中的选项后,重启。Fiddler在启动时,才会加载证书信任列表,重启Fiddler确保能够识别新的配置。
1.2 为什么要删除以前的证书残留
问题原因:
-
fiddler每次重新生成证书时,会常见新的公钥和私钥对。残留在系统的信任库中,可能会导致信任链冲突
-
部分系统或应用会缓存证书链中的中间证书,残留的旧中间证书可能干扰新证书的验证流程
-
操作系统(如 Windows)和浏览器(如 Chrome、Firefox)会在内存或磁盘中缓存证书信息。残留的旧证书可能导致应用错误地优先使用缓存而非新证书。
-
证书存储位置冲突
Fiddler 证书默认安装在系统的 受信任根证书颁发机构 存储区。若旧证书未删除,新证书可能因名称重复而安装失败,或导致系统无法识别正确的证书。
正确的流程:
-
清除所有的证书凭证(包括手机端和电脑端的凭证)
-
再进行证书的安装
1.3 Android版本导致的证书安装问题
1.3.1Android7.0+的系统限制
-
问题原因:
-
Android7.0+以上的默认仅信任系统证书,而不再自动信任用户手动安装的证书
-
对于许多应用(targetSdkVersion≥24的应用)默认忽略用户证书,导致HTTPS抓包失败
-
-
解决方案
-
方法1:修改应用代码(仅限调试版本)
-
在应用的AndroidManifest.xml中配置android:networkSecurityConfig,允许信任用户证书
<network-security-config><base-config><trust-anchors><certificates src="system" /><certificates src="user" /> <!-- 允许用户证书 --></trust-anchors></base-config> </network-security-config
-
-
方法2:降级系统或应用
- 将测试设备的 Android 系统降级到 7.0 以下,或使用旧版本应用(
targetSdkVersion < 24
)。
- 将测试设备的 Android 系统降级到 7.0 以下,或使用旧版本应用(
-
方法3:Root设备并安装为系统证书【电脑端】
将 Fiddler 证书转换为系统证书(需 Root)
-
将证书文件(如
FiddlerRoot.cer
)重命名为hash.0
(使用 OpenSSL 生成哈希值)。# 第一步将其转化为pem格式 openssl x509 -inform DER -in C:\Users\20504\Desktop\FiddlerRoot.cer -out C:\Users\20504\Desktop\FiddlerRoot.pem# 第二部,查看哈希值并命名文件 openssl x509 -inform PEM -subject_hash_old -in C:\Users\c-book\Desktop\FiddlerRoot.pem
-
复制到
/system/etc/security/cacerts/
目录。adb root # 启动root adb remount # 文件挂载 adb push bbHBF_rPA.0 /system/etc/security/cacerts/ # 拉到指定目录 ,注意自己的文件地址
-
修改文件权限为
644
。adb shell chmod 644 system/etc/security/cacerts/bbHBF_rPA.0
-
-
方法4: 手动安装证书【Android端】
-
在浏览器中输入
http://ip:8888
,点击下载以【FiddlerRoot.crt格式的证书】-
ip是你本机中局域网地址,并不是公网ip
# 可以通过windows 中ipconfig命令查询 ipconfig
-
port:8888,是在fiddler中配置的连接端口
-
-
点击进行安装即可----这一步是安装用户凭证,此时已经是hash.0的格式了
-
将用户凭证转换成系统凭证【具有root权限的系统,或相似的功能】
用户凭证存放地址:
/data/mis/user/0/carcerts-added
系统凭证存放地址:
/system/etc/security/cacerts/
注意:可以通过
MT管理器
或其他具有root权限的文件管理工具,进行移动,将用户凭证移动系统凭证存放,应该也可以使用adb命令进行移动吧,我没有测试!
-
-
1.3.2证书的格式问题
- 证书的格式
- pem
- cer :fiddler在windwos系统中,生成的是cer
- crt :我们通过http:ip:prot,下载的格式crt
注意:1.3.1章节中,已经给正确的处理流程,本章节只进行格式之间的对比讲解
式 | 编码 | 可读性 | 跨平台 | 包含内容 |
---|---|---|---|---|
PEM | Base64 | 高 | ✔️ | 证书/私钥/链 |
CER | DER | 低 | ✔️ | 仅证书 |
CRT | PEM/DER | 混合 | ✔️ | 证书/链 |
假如我们将.cer进行安装,可能会出现证书编码异常的问题【可能,也可能出现正常的情况。自行测试】导致证书没办法进行解析。 由于cer并不存在证书链缺乏中间证书,也可能导致android验证失败
2.Fiddler证书生成的参数问题
以上内容正确处理的情况,还是出现安全证书出现的问题。请尝试以下方法!
修改注册表项 ReverseProxyForPort
并设置为 Fiddler 的监听端口(如 8888)的核心原理是强制 Fiddler 正确配置反向代理端口,从而解决因代理端口与证书绑定不匹配导致的 HTTPS 抓包异常问题。
问题原因:
-
默认情况下,fiddler通过监控端口(8888)接受客户端的请求
-
当Fiddler作为方向代理时,它需要将请求转发到目标服务器的实际端口(443或80)但某些情况下,端口转发逻辑可能未正确绑定到证书生成机制。
正确流程:
-
运行命令行,打开注册表信息
-
找到注册表信息
- 路径可以参考:
计算机\HKEY_CURRENT_USER\Software\Microsoft\Fiddler2
- 路径可以参考:
-
添加一个
ReverseProxyForPort
值为8888
-
然后按照证书安装的路径重新安装一遍
效果:
- 强制Fiddler在生成动态证书时,将端口信息包含在SAN上
- 确保客户端验证证书时,检测到端口与证书声明的端口一致
- 解决因端口不匹配导致的
ERR_CERT_COMMON_NAME_INVALID
或类似错误。
3.APP中SSL Pinning技术
现象:即使你已经正确的安装好了证书,且能够抓取的手机端中浏览器的HTTPS,你也可能会遇到某些APP中无法进行联网的情况,或者只能抓取某个App中http的情况,你是无法抓取HTTPS协议的。
问题原因:
SSL Pinning
:- 部分应用可能采用更严格的证书检验逻辑,如使用非标准网络库(如OkHttp3、Conscrypt)或原生代码(Native Code)实现证书绑定,强制APP仅信任特定的证书。
- 导致Fiddler作为中间攻击者,即使你具有Fiddler的证书,APP也会拒绝信任,导致抓包失败
解决方法:
-
绕过
SSL Pinning
(使用工具Lsposed+JustTrustME
需要安装面具) -
修改
SSL Pinning
的逻辑 -
使用全局代理
3.1 绕过SSL Pinning的方法
JustTrustMe工具,绕过证书固定的方法,它是针对Android的Xposed模块(或通过Magisk模块实现),通过修改系统的SSL/TLS 验证逻辑,强制APP 信任用户安装的证书,从而绕过APP自身的证书固定机制
3.1.1 JustTrustme的核心作用
- Hook SSL 验证逻辑
拦截 Android 系统中关键的 SSL 验证类(如TrustManagerImpl
、OkHttp
、X509TrustManager
等),强制让 App 信任所有证书,包括用户安装的抓包证书。 - 覆盖常见网络库的验证
支持多种网络库(如OkHttp
、Retrofit
、Apache HttpClient
等),确保不同技术栈的 App 都能被绕过证书固定。
3.1.2 局限性
-
依赖 Root 和 Xposed 环境
- Android 设备需解锁
Bootloader、Root
,并安装 Xposed 框架或 Magisk(通过 LSPosed 模块加载)。 - 部分新版本 Android 系统(如 Android 13+)可能兼容性较差。
- Android 设备需解锁
-
【无法绕过所有证书固定】
-
如果App使用标准证书固定(如Native代码实现、自定义加密库),可能需要其他的工具(Frida)辅助
-
**优化策略:**可以添加多个类似的功能:
SSLUnpinning
、TrustMeAlread
-
-
安全风险
- 强制信任所有证书会降低设备安全性,仅建议在测试环境使用
3.1.3 增加绕过 SSL Pinning的方法
-
Frida:一个动态代码插桩框架,通过注入JavaScript 或 Python 脚本到目标进程中,实现对运行时行为的监控和修改。
- 进程注入:通过frida-server在设备中运行,与客户端PC通信,将代码注入目标应用进程
- 动态Hook:劫持目标函数调用,拦截参数、返回值或修改逻辑。Hook网络库的证书验证方法,强制信任中间人证书
-
Objection:基于Frida的集成工具,封装了常见的逆向任务,通过命令行提供“无代码”操作体验
-
自动化Hook:预置脚本覆盖了主流网络库(Android的
TrustManagerImpl
,iOS的NSURLSession
),通过Android sslpinning disable
等命令一键禁用证书绑定 -
内存漫游:支持快速搜搜哦内存中的类、方法、实例,并直接调用或修改
-
环境模拟:模拟越狱/root环境,绕过应用对设备状态的检测
-
-
典型操作流程
-
环境配置
- 安装Frida Server到设备并启动
- 通过
objection -g <包名> explore
注入目标应用。
-
绕过 SSL Pinning:
- 执行
android sslpinning disable
或ios sslpinning disable
,Objection 自动 Hook 常见校验函数(如TrustManager
)
- 执行
-
动态调试:(内存数据分析,可选)
- 使用
android hooking watch class_method
监控方法调用参数和返回值910。 - 通过
memory dump
导出内存数据进行分析
- 使用
-
-
处理复杂的SSL Pinning
- 非标准网络库:若应用使用自定义网络库或 Native 代码(如 OpenSSL),需手动编写 Frida 脚本 Hook 底层函数(如
SSL_CTX_set_cert_verify_callback
) - 双向认证(mTLS):需提取客户端证书并配置到抓包工具(如 Charles)
- HTTPS协议本身是支持双向认真的,既除了客户端对服务器证书进行验证外,服务器也可以要求客户端提供自己的证书信息并对其进行验证,在APP上,HTTPS双向认真的方案也可以防止中间人劫持,但这种双向认证开销较大,且安全性与”ssl pinning”一致,因此目前大多数APP都采用SSL Pinning这种方案
- 非标准网络库:若应用使用自定义网络库或 Native 代码(如 OpenSSL),需手动编写 Frida 脚本 Hook 底层函数(如
3.2 修改SSL Pinning的固定逻辑【逆向基础】
通过修改 **libsscronet.so
**中的函数逻辑,实现SSl Pinning的绕过方法
-
libsscronet.so是Chromium网络库的一部分,用于处理网络请求,包括SSL/TLS。
-
.so
文件是动态链接库,包含编译后的机器码。通过逆向工具(如 IDA Pro、Ghidra)可分析其函数逻辑,并直接修改二进制指令以绕过证书验证
3.2.1 文件存放的位置
- 在APK包中,我们可以拉到电脑端上的桌面以解压工具,进行打开可以查看APP结构
- 路径
- 一般在
Lib
下的armebo-v72 (32位架构)/arm64-v8a(64位架构)
- 一般在
3.2.2 修改逻辑的步骤
-
反编译APK:使用
apktool
解压 APK,提取libsscronet.so
:apktool d target.apk -o output_dir
-
使用IDA Pro/Ghidra 分析
- 加载
libsscronet.so
到逆向工具中,分析关键函数:- 证书验证函数:如
ssl_crypto_x509_session_verify_cert_chain
(Chromium 中验证证书链的核心函数)。 - SSL 初始化函数:如
SSL_CTX_set_cert_verify_callback
(设置证书验证回调)。
- 证书验证函数:如
- 搜索特征字符串:例如
pinning failure
、certificate verify failed
,快速定位错误提示逻辑。
- 加载
-
修改逻辑:目标:通过修改二进制指令强制跳过证书。(自行分析)
- 使用IDA的Patch 功能:直接修改二进制指令,生成新的
.so
文件 - 注意:随着App迭代的升级,相对应的逻辑结构也会自动的更新,这东西具有时效性。
- 使用IDA的Patch 功能:直接修改二进制指令,生成新的
-
重新打包与测试
-
替换修改后的
.so
文件:将修改后的libsscronet.so
放回 APK 的对应架构目录中 -
重打包并签名
apktool b output_dir -o modified.apk jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1 -keystore your.keystore modified.apk alias_name
-
安装测试:安装修改后的 APK,使用抓包工具(如 Fiddler)验证 HTTPS 请求是否可捕获。
-
3.2.3 替代方案
-
动态 Hook(推荐)
使用 Frida 直接 Hooklibsscronet.so
中的证书验证函数,无需修改二进制文件。例如:// Frida 脚本示例(Hook SSL 验证函数) Interceptor.attach(Module.findExportByName("libsscronet.so", "ssl_crypto_x509_session_verify_cert_chain"), {onLeave: function(retval) {retval.replace(0x1); // 强制返回验证成功} });
-
优点:无需反编译、适配多架构,适合加固或混淆的 App。
4.Drony流量转发
【软件不进行介绍了】:原理应该是在手机上设置一个代理,将APP的所有请求都转发到抓包工具上【强行使APP走代理】,这样就可以抓取HTTPS请求了。
教程可以去搜索,最近帮助复习就不进行讲解了。