背景

当你测试App的时候,想要通过Fiddler/Charles等工具抓包看下https请求的数据情况,发现大部分的App都提示网络异常/无数据等等信息。以“贝壳找房”为例:

Fiddler中看到的请求是这样的:

你可能开始找证书的问题:是不是Fiddler/Charles的证书没有导入的手机中去?配置一遍又一遍,又开始对比web端浏览器的https发现没问题,这时候你可能已经不知所措了。

究竟是不是证书的问题?

没错,就是证书的问题,但跟你想象中的证书有点不同,不是Fiddler内置证书的问题,而是App内置证书的问题 -- SSL Pinning机制(也可称为证书绑定)。

什么是SSL Pinning?

首先,在https的建立连接过程中,当客户端向服务端发送了连接请求后,服务器会发送自己的CA证书(包括证书有效期、颁发机构等)给客户端,如果客户端是浏览器,则使用浏览器内置的根证书去校验服务器CA证书的合法性。

**为什么Fiddler能够抓得到浏览器的https请求呢? **

原因就是在浏览器面前Fiddler伪装成一个https服务器,用户可以自由的将Fiddler的伪装证书导入到浏览器内置的根证书中。此时Fiddler作为中间人在真正的服务器面前伪装成浏览器的角色。

明白上述一点之后,我们再回到App客户端,App默认是信任系统(Android or IOS)用户第三方安装的的CA证书的,有一些App能够通过Fiddler抓到包的原因是因为:我们可以在系统的用户CA证书集中添加Fiddler的证书。这样App就能信任证书是安全的,放心的发送请求了。

但是现在随着系统的更新,Google or Apple认识到安全越来越重要,所以就引入SSL-Pinning技术:

开发者预先把证书相关信息预置到App中再打包,这样在https通讯过程中App本地可以与服务器返回的CA证书可以做合法性校验,如果发现不一致,那么可能就是由于中间人攻击(比如Fiddler/Charles抓包工具),App客户端可以终止https链接。而在新版本的系统规则中,应用只信任系统默认预置的CA证书,如果是第三方安装的证书(比如Fiddler安装的)则不会信任:

解决方案

上面的都是一些理论方面的内容,到底该如何突破SSL Pinning机制能够抓到App的https请求包呢?

方案一:使用Android7.0以下的系统

目前已验证在Android 7.0或以上的系统有启用了对第三方证书的限制。但是在Android 7.0以下还是依旧可以将Fiddler/Charles的证书安装在用户的CA集中抓取https请求。

方案二:将Fiddler/Charles证书安装到系统默认预置的CA证书区域中

此种办法前提是需要root权限,但是现在很多新款手机获取root权限困难,所以此办法并不推荐。

方案三:反编译APK,修改AndroidManifest.xml文件

  • 有些APK加了壳,需要先进行脱壳处理
  • 再通过apktool等工具进行反编译
  • 在源码的res/xml目录添加network_security_config.xml文件,内容如下:
<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
<base-config cleartextTrafficPermitted="true">
<trust-anchors>
<!-- 信任系统预置CA 证书 -->
<certificates src="system" />
<!-- 信任用户添加的 CA 证书,Charles 和 Fiddler 抓包工具安装的证书属于此类 -->
<certificates src="user" />
</trust-anchors>
</base-config>
</network-security-config>
  • 修改AndroidManifest.xml文件,在application标签中增加android:networkSecurityConfig="@xml/network_security_config"
<?xml version="1.0" encoding="utf-8"?>
<manifest ... >
<application android:networkSecurityConfig="@xml/network_security_config"
... >
...
</application>
</manifest>

此种方案比较适用于对反编译比较熟练的童靴

方案四:VitualXposed框架+JustTrustMe模块(推荐)

VitualXposed介绍:

Use Xposed with a simple APP, without needing to root, unlock the bootloader, or flash a system image

官网下载地址:https://vxposed.com/

简单来说,VitualXposed可以在不需要设备root的情况下,修改App的行为。此应用的工作原理类似于应用分身功能,会将应用安装到一个虚拟独立的环境当中,其内部会自带一个已经激活了的Xposed工具。

JustTrustMe介绍:

An xposed module that disables SSL certificate checking for the purposes of auditing an app with cert pinning

JustTrustMe是Github上面的一个开源项目,是xposed中的一个模块,用于禁止SSL证书验证。

https://github.com/Fuzion24/JustTrustMe

操作流程:

  • 将VitualXposed安装到真机中,点击应用按钮->添加应用,将要调试的App、JustTrustMe.apk进行安装

  • 打开Xposed,选择左上角导航栏->模块,勾选JustTrustMe

  • 重启VitualXposed应用,打开贝壳找房,通过Fiddler抓包,可以看到App请求正常,https请求能抓到

App 抓包提示网络异常怎么破?的更多相关文章

  1. Fiddler和app抓包

    1:请在“运行”,即下面这个地方输入certmgr.msc并回车,打开证书管理. 打开后,请点击操作--查找证书,如下所示: 然后输入“fiddler”查找所有相关证书,如下所示: 可以看到,我们找到 ...

  2. Fiddler+雷电模拟器进行APP抓包

    1.下载最新版Fiddler,强烈建议在官网下载:https://www.telerik.com/download/fiddler 2. 正常傻瓜式安装,下一步,下一步,安装完毕后,先不用急于打开软件 ...

  3. Scrapy——6 APP抓包—scrapy框架下载图片

    Scrapy——6 怎样进行APP抓包 scrapy框架抓取APP豆果美食数据 怎样用scrapy框架下载图片 怎样用scrapy框架去下载斗鱼APP的图片? Scrapy创建下载图片常见那些问题 怎 ...

  4. APP 抓包-fiddler

    App抓包原理 客户端向服务器发起HTTPS请求 抓包工具拦截客户端的请求,伪装成客户端向服务器进行请求 服务器向客户端(实际上是抓包工具)返回服务器的CA证书 抓包工具拦截服务器的响应,获取服务器证 ...

  5. fiddler抓包+安卓机 完成手机app抓包的配置 遇到的一些问题

    fiddler抓包+安卓模拟器完成手机app抓包的配置:fiddler抓包+雷电模拟器 完成手机app抓包的配置 其实在安卓真机上弄比在虚拟机上弄更麻烦一点,它们的步骤都差不多一样,就是在安卓真机上弄 ...

  6. Wireshark数据抓包分析——网络协议篇

                   Wireshark数据抓包分析--网络协议篇     watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvZGF4dWViYQ==/ ...

  7. Fiddler 网页采集抓包利器__手机app抓包

    用curl技术开发了一个微信文章聚合类产品,把抓取到的数据转换成json格式,并在android端调用json数据接口加以显示: 基于weiphp做了一个掌上头条插件,也是用的网页采集技术:和一个创业 ...

  8. scrapy之手机app抓包爬虫

    手机App抓包爬虫 1. items.py class DouyuspiderItem(scrapy.Item): name = scrapy.Field()# 存储照片的名字 imagesUrls ...

  9. 猫眼电影App抓包获取评论数据接口

     之前在CSDN程序人生公众号上看到了这篇文章<邪不压正>评分持续走低,上万条网友评论揭秘,是救救姜文还是救救观众?,文中提到了通过抓包猫眼App发现了评论的数据接口:http://m.m ...

随机推荐

  1. 第二阶段冲刺个人任务——one

    今日任务: 修改注册界面.

  2. 解决luajit ffi cdata引用cdata的问题

    使用luajit ffi会遇到cdata引用cdata的情况.官方说明是必须手动保存所有cdata的引用,否则会被gc掉. ffi.cdef[[ struct A { int id; }; struc ...

  3. Git提交代码和更新代码命令

    微信公众号:非科班的科班关注可了解更多的java教程和其它资源视频.问题或建议,请公众号留言; 1.Git提交代码 利用命令提交代码的步骤:1.1.拉取服务器代码,避免覆盖他人的代码 git pull ...

  4. Python PE8编程规范

    参考博客:https://blog.csdn.net/weixin_39723544/article/details/82144280 1.使用四个空格而不是tab进行缩进 2.默认使用utf-8编码 ...

  5. nginx文件压缩

    nginx文件压缩 如果我们租用了一个带宽很低的服务器,网站访问速度会很慢,这时我们可以通过让nginx开启GZIP压缩来提高网站的访问速度. 首先我们对nginx进行限速操作,限制每个连接的访问速度 ...

  6. Spring注解开发系列Ⅳ --- 属性赋值

    在Spring框架中,属性的注入我们有多种方式,我们可以通过构造方法注入,可以通过set方法注入,也可以通过p名称空间注入,方式多种多样,对于复杂的数据类型比如对象.数组.List集合.map集合.P ...

  7. vue报错Error in v-on handler: "RangeError: Maximum call stack size exceeded"

    看下面的报错 错误 看到这个错误一脸懵逼.后面了解到,是因为程序进入了死循环,后面检查了我的代码,原来在这里自己调用自己

  8. Kafka网络模型和通信流程剖析

    1.概述 最近有同学在学习Kafka的网络通信这块内容时遇到一些疑问,关于网络模型和通信流程的相关内容,这里笔者将通过这篇博客为大家来剖析一下这部分内容. 2.内容 Kafka系统作为一个Messag ...

  9. STM32系列之初探(二)

    问题一: 什么是STM32 新的基于ARM内核的32位MCU系列 内核为ARM公司为要求高性能,低成本,低功耗的嵌入式应用专门设计的Crotex-M内核 标准的ARM体系 特点: 高性能 低电压 低功 ...

  10. CAD制图系列之怎么画平行线

    CAD怎么画平行线 输入O,点空格,输入距离100,选择已知的线,往你要偏移的方向就好! 具体方法如下:1.打开CAD制图 2.输入快捷键O 3.按下空格键 4.输入你所要的距离,例如12,并按下空格 ...