抓取iOS设备中的HTTPS请求
1、抓取iOS模拟器中的HTTPS请求

iOS模拟器iOS真机器相比,iOS模拟器PC宿主用的同一个网络,所以, 要抓取iOS模拟器中的HTTPS请求的话,不需要设置网络代理,因为根本就没有设置的地方。

只需要安装Charles Root CA,安装步骤如下:

1、打开Charles

2、打开一个iOS Simulator

3、通过点击Charles的菜单Help ➝ SSL Proxying ➝ Install Charles Root Certificate in iOS Simulators,出现如下提示:

4、点击OK按钮,然后通过点击iOS SimulatorSettings ➝ General ➝ About ➝ Certificate Trust Settings,界面如下:

5、点击开关按钮,出现如下的提示:

6、点击Continue按钮。

该证书已经被用户设置为受信任的证书了。此时就可以用Charles抓取该iOS Simulator中的app发起的HTTPS请求了。

2、抓取iOS真机中的HTTPS请求

抓取iOS真机中的HTTPS请求的步骤如下:

1、与抓取iOS真机中的HTTP请求的步骤一样

2、在iOS真机的浏览器中打开http://chls.pro/ssl,会出现如下的弹出框:

这个链接的本质就是从您本地PC上的Charles中复制证书到您的Android设备,然后安装之。

给这个证书取个名字,比如Charles,然后点击OK按钮。

现在就可以用这个Android设备抓取HTTPS请求了。

4、Android7.0之后的系统

Android7.0开始的系统默认不信任用户自己添加到系统的CA证书,也就是说, 即使你在Android7.0之后的系统上安装了Charles Proxy CA, 也无法抓取HTTPS请求,那如何解决此问题呢?

Android官方解决方案

Android官方解决方案对我们来说,一般没啥作用,因为我们抓包通常是抓别人的App的数据,我们一般不会对别人的App做修改。

还有一种办法需要把手机ROOT掉,方法如下:

Android系统的系统证书的存放目录是:/system/etc/security/cacerts/

下面是某Android手机的/system/etc/security/cacerts/目录下的内容:

该目录里面的证书文件的文件名规则为:${Certificate_Hash}.{Number}

${Certificate_Hash}可以通过如下命令获得:

openssl x509 -subject_hash_old -in charles-ssl-proxying-certificate.pem | head -n 1

{Number}作为后缀名,是为了防止文件名冲突的,比如如果两个证书算出${Certificate_Hash}是一样的话, 那么其中一个证书的后缀名数字可以设置成0,而另一个证书的后缀名数字可以设置成1

计算好${Certificate_Hash}之后,我们就把证书重命名:

cp charles-ssl-proxying-certificate.pem e18b03cd.0

把符合命名规则的证书推送到手机的/system/etc/security/cacerts/目录下:

adb push e18b03cd.0 /system/etc/security/cacerts/e18b03cd.0

此时你应该可以在手机的设置->安全->加密与凭据->信任的凭据的系统标签页看到你新加入的证书,将其启用即可顺利抓包

Read-only file system

mount -o remount rw /