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,允许信任用户证书

        xml 复制代码
        <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)。
    • 方法3:Root设备并安装为系统证书电脑端

      将 Fiddler 证书转换为系统证书(需 Root

      1. 将证书文件(如 FiddlerRoot.cer)重命名为 hash.0(使用 OpenSSL 生成哈希值)。

        shell 复制代码
        # 第一步将其转化为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
      2. 复制到 /system/etc/security/cacerts/ 目录。

        shell 复制代码
        adb root  # 启动root
        adb remount  # 文件挂载
        adb push bbHBF_rPA.0 /system/etc/security/cacerts/   # 拉到指定目录 ,注意自己的文件地址
      3. 修改文件权限为 644

        shell 复制代码
        adb shell chmod 644 system/etc/security/cacerts/bbHBF_rPA.0
    • 方法4: 手动安装证书Android端

      1. 在浏览器中输入http://ip:8888点击下载 以【FiddlerRoot.crt格式的证书

        • ip是你本机中局域网地址 ,并不是公网ip

          shell 复制代码
          # 可以通过windows 中ipconfig命令查询
          ipconfig
        • port:8888,是在fiddler中配置的连接端口

      2. 点击进行安装即可----这一步是安装用户凭证此时已经是hash.0的格式了

      3. 将用户凭证转换成系统凭证【具有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)但某些情况下,端口转发逻辑可能未正确绑定到证书生成机制

正确流程:

  1. 运行命令行,打开注册表信息

  2. 找到注册表信息

    • 路径可以参考:计算机\HKEY_CURRENT_USER\Software\Microsoft\Fiddler2
  3. 添加一个ReverseProxyForPort值为8888

  4. 然后按照证书安装的路径重新安装一遍

效果:

  • 强制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的核心作用

  1. Hook SSL 验证逻辑
    拦截 Android 系统中关键的 SSL 验证类(如 TrustManagerImplOkHttpX509TrustManager 等),强制让 App 信任所有证书,包括用户安装的抓包证书。
  2. 覆盖常见网络库的验证
    支持多种网络库(如 OkHttpRetrofitApache HttpClient 等),确保不同技术栈的 App 都能被绕过证书固定。

3.1.2 局限性

  • 依赖 Root 和 Xposed 环境

    • Android 设备需解锁 Bootloader、Root,并安装 Xposed 框架或 Magisk(通过 LSPosed 模块加载)。
    • 部分新版本 Android 系统(如 Android 13+)可能兼容性较差。
  • 无法绕过所有证书固定

    • 如果App使用标准证书固定(如Native代码实现、自定义加密库),可能需要其他的工具(Frida)辅助

    • **优化策略:**可以添加多个类似的功能:SSLUnpinningTrustMeAlread

  • 安全风险

    • 强制信任所有证书会降低设备安全性,仅建议在测试环境使用

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 disableios 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这种方案

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 failurecertificate verify failed,快速定位错误提示逻辑。
  • 修改逻辑:目标:通过修改二进制指令强制跳过证书。(自行分析)

    • 使用IDA的Patch 功能:直接修改二进制指令,生成新的.so文件
    • 注意:随着App迭代的升级,相对应的逻辑结构也会自动的更新,这东西具有时效性。
  • 重新打包与测试

    • 替换修改后的.so文件 :将修改后的 libsscronet.so 放回 APK 的对应架构目录中

    • 重打包并签名

      shell 复制代码
      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 直接 Hook libsscronet.so 中的证书验证函数,无需修改二进制文件。例如:

    javascript 复制代码
    // 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请求了。

教程可以去搜索,最近帮助复习就不进行讲解了。

相关推荐
To_OC8 小时前
别再串行写 await 了,Promise.all 才是并行请求的正确打开方式
前端·javascript·promise
vipbic8 小时前
中后台越做越乱后,我用插件化把它救回来了
前端·vue.js
Hyyy8 小时前
Computer Use 适合做什么,不适合做什么——一次真实使用后的思考
前端
小和尚同志9 小时前
前端 AI 单元测试思考与落地
前端·人工智能·aigc
草根站起来9 小时前
“双算法SSL证书”伪方案、国产SSL证书营销话术与等保绑定乱象批判
网络·网络协议·ssl
invicinble10 小时前
c端系统,其实更像一个信息展示平台
前端
李姆斯11 小时前
管理是否可以被完全量化
前端·产品经理·团队管理
名字还没想好☜11 小时前
Next.js 中间件实战:鉴权、重定向与 A/B 分流
开发语言·前端·javascript·中间件·react·next.js
广州灵眸科技有限公司12 小时前
瑞芯微RV1126B开发板(EASY-EAI-PI2) INI文件操作
java·前端·javascript·网络·人工智能
心中有国也有家12 小时前
AtomGit Flutter 鸿蒙客户端:ModalBottomSheet 实战
android·javascript·学习·flutter·华为·harmonyos