zoukankan      html  css  js  c++  java
  • Android及IOS charles抓取https报文

    1、首先设置proxy>proxy setting> 勾上enable transparent HTTP proxying。

    2、安装电脑端证书help>ssl proxying>install Charles Root Certificate

    3、在证书页面选始终信任

    4、手机端下载证书help>ssl proxying>XXXX Modile Device XXX

    5、手机和电脑连接同一个网络,在网络的高级设置中填写上图的IP(10.0.69.179:8888)

    6、Proxy -> SSL Proxying Settings...,选择SSL Proxying > add > host:*,port:443

    Android

    7、在手机浏览器访问chls.pro/ssl 自动下载证书。(推荐使用Chrome浏览器),从 下载内容 里面点击证书完成安装。

    Android

    8、在项目res 下添加xml 文件夹以及network_security_config.xml 文件

    内容:

    <base-config cleartextTrafficPermitted="true">
                <certificates src="system" overridePins="true" />
                <certificates src="user" overridePins="true" />
    </network-security-config>
    

    9、在manifest 的application节点下添加引用

    android:networkSecurityConfig="@xml/network_security_config"
    

    10、打开APP进行网络请求,最后一步在Charles在打开的网址上右键设置 enable SSL proxying ,再次访问刚才的请求就好了。

    Android 7.0(API 级别 24)及更高版本默认只承认系统CA,所以默认是安全的,不需要配置。
    如果想要系统承认用户自己安装的CA,则修改配置(比如调试时会需要抓包)。
    面向 Android 6.0(API 级别 23)及更低版本应用的默认配置如下所示,这段配置的意思是,承认系统CA和用户自己安装的CA,
    但这是一个默认配置,目前在6.0及以前好像都不起作用,即使去掉了user,依然承认自己安装的CA,不能确保100%防止https抓包

    <?xml version="1.0" encoding="utf-8"?>
    <network-security-config>
    <base-config cleartextTrafficPermitted="true">
        <trust-anchors>
            <certificates src="system" />
            <certificates src="user" />
        </trust-anchors>
    </base-config>
    </network-security-config>
    

    面向 Android 7.0(API 级别 24)及更高版本应用的默认配置如下所示,即只承认系统CA,如果要承认自己安装的CA,像上述6.0配置那样加上user即可

    <?xml version="1.0" encoding="utf-8"?>
    <network-security-config>
    <base-config cleartextTrafficPermitted="true">
        <trust-anchors>
            <certificates src="system" />
        </trust-anchors>
    </base-config>
    </network-security-config>
    

    实际操作:
    1、在res/xml/下创建network_security_config.xml文件
    2、文件写入上述配置
    3、在清单文件的application标签下,引入此配置

    <application android:networkSecurityConfig="@xml/network_security_config"
       ... >
       ...
    </application>
    

    官方地址:https://developer.android.com/training/articles/security-config#ConfigCustom

    IOS

    11、IOS系统描述文件


    在iOS 10.3之前,当你将安装一个自定义证书,iOS会默认信任,不需要进一步的设置。
    而iOS 10.3之后,安装新的自定义证书默认是不受信任的。

    12、信任证书

    如果要信任已安装的自定义证书,需要手动打开开关以信任证书。
    iOS11下需要手动信任已下载好的证书,方法如下:
    设置->通用->关于本机->证书信任设置-> 找到charles proxy custom root certificate然后信任该证书即可.

    原理简析

    如果是HTTP请求,因为数据本身并没加密所以请求内容和返回结果是直接展现出来的。
    但HTTPS是对数据进行了加密处理的,如果不做任何应对是无法获取其中内容。所以Charles做的就是对客户端把自己伪装成服务器,对服务器把自己伪装成客户端:

    1、Charles拦截客户端的请求,伪装成客户端向服务器进行请求
    2、服务器向“客户端”(实际上是Charles)返回服务器的CA证书
    3、Charles拦截服务器的响应,获取服务器证书公钥,然后自己制作一张证书,将服务器证书替换后发送给客户端。(这一步,Charles拿到了服务器证书的公钥)
    4、客户端接收到“服务器”(实际上是Charles)的证书后,生成一个对称密钥,用Charles的公钥加密,发送给“服务器”(Charles)
    5、Charles拦截客户端的响应,用自己的私钥解密对称密钥,然后用服务器证书公钥加密,发送给服务器。(这一步,Charles拿到了对称密钥)
    6、服务器用自己的私钥解密对称密钥,向“客户端”(Charles)发送响应
    7、Charles拦截服务器的响应,替换成自己的证书后发送给客户端
    当然,如果用户不选择信任安装Charles的CA证书,Charles也无法获取请求内容。
    还有一种,如果客户端内置了本身的CA证书,
    这时如果Charles把自己的证书发送给客户端,客户端会发现与程序内的证书不一致,不予通过,此时Charles也是无法获取信息的。
    https://www.jianshu.com/p/ec0a38d9a8cf?utm_campaign=hugo

  • 相关阅读:
    [转]MongoDB for Java】Java操作MongoDB
    [转]Apache Maven 入门篇 ( 上 )
    [转]Apache Maven 入门篇(下)
    [转]-Dmaven.multiModuleProjectDirectory system propery is not set. 解决方案 适用于myeclipes 和 eclipes
    [转]java代码注释规范
    [转] java编程规范
    [原创]java WEB学习笔记43:jstl 介绍,core库详解:表达式操作,流程控制,迭代操作,url操作
    [转]详解Java解析XML的四种方法
    [原创]java WEB学习笔记42:带标签体的自定义标签,带父标签的自定义标签,el中自定义函数,自定义标签的小结
    [原创]java WEB学习笔记41:简单标签之带属性的自定义标签(输出指定文件,计算并输出两个数的最大值 demo)
  • 原文地址:https://www.cnblogs.com/xidianzxm/p/14246539.html
Copyright © 2011-2022 走看看