iOS小技能:Charles抓包【应用场景:App联调测试】(绕过Certificate Pinning的方案)

5,094 阅读4分钟

“我正在参加「掘金·启航计划」”

前言

Charles 支持的协议:HTTP/1.1、HTTPS、HTTP/2、ws(WebSocket)、wss(WebSocket Secure,TLS 加密的 WebSocket)、SOCKS

“⚠️ 注:Charles 不支持 HTTP/3,但是大部分开启 HTTP/3 的网站都做了降级处理

若想抓取其他协议的报文,推荐用 Wireshark Wireshark用的是RVI(Remote Virtual Interface)(iOS5以上才支持)。

更多关于Wireshark 请看这篇为文章:blog.csdn.net/z929118967/…

I 抓包配置

1.1 iOS侧的代理配置(默认不支持拦截SSL数据)

  • 把 iOS 的网络包转发到代理 IP 和代理端口的配置

在这里插入图片描述

确保Mac和iPhone在一个局域网,并在iPhone上设置代理信息:Mac端地址代理端口即可

五元组:源 IP 地址,源端口,传输层协议,目的 IP 地址和目的端口

  • 查看 Mac地址 在这里插入图片描述 或者使用ifconfig查看IP
	inet 192.168.1.107 netmask 0xffffff00 broadcast 192.168.1.255

Charles 的代理端口号可以从Charles -> Proxy -> Proxy Setttings进行查看和更改。端口默认是 8888 在这里插入图片描述

1.2 Mac侧的证书安装

需要信任证书,否则将提示: You may need to configure your browser or application to trust the Charles Root Certificate.

HTTPS = HTTP 协议 + TLS 协议

在 TCP 三次握手之上加入了四次 TLS 握手,TLS 握手过程中会校验加密用的公钥证书,所以想要拦截SSL请求,我们需要手动安装并信任 Charles 的证书,

  • Mac侧的证书安装

Charles -> Help -> SSL Proxying -> Install Charles Root Certificate

  • iPhone上的设置方法: Charles -> Help -> SSL Proxying -> Install Charles Root Certificate on a Mobile Derive,这时候会跳出一个弹窗,根据提示在手机端访问 chls.pro/ssl,下载安装 Charles CA 证书

或者直接访问charlesproxy.com/charles.crt… 证书,可以选择先发证书到邮箱,再从系统邮箱选择安装

在这里插入图片描述

设置->通用 -> 选择对应的描述文件进行安装信任刚刚下载的证书。

1.3 iOS端信任证书的方法

  • iOS 信任证书
iOS10.3.1 新安装的证书需要手动选择信任证书。

解决方式:

设置->通用->关于本机->证书信任设置
  • 应用场景:iOS10.3.1 新安装的证书需要手动选择信任证书。

解决方案

II 解决Certificate Pinning导致的无法分析问题

在 HTTPS 请求时,服务端发给客户端的公钥证书必须和客户端内置的公钥证书一致才能请求成功。

(支付行业的产品都会采用这个基本的验证,具体请看这篇文章kunnan.blog.csdn.net/article/det…

方案1:把证书和私钥导入到 Charles

  • 解决方案1:把证书和私钥导入到 Charles 中,解决Certificate Pinning

Charles -> Proxy -> SSL Proxying Setting -> Root Certificate,然后导入 .pem 或 p12 文件 在这里插入图片描述 双向认证的配置

  • 方案2:如果没有公钥证书和随之配套的私钥,这个时候当然可以采取逆向的手段来绕过证书校验

方案2:借助逆向手段来绕过证书校验

更多相关信息请看这篇文章:kunnan.blog.csdn.net/article/det…

pinning/disable.js: This hook attempts many ways to kill SSL pinning and certificate

III 预备知识

3.1 获取站点的证书【可选】

如果遇到app进行本地证书验证的时候,需要在iPhone上信任对应的站点证书

使用openssl命令来获取到服务器的公开二进制证书(以google为例):

openssl s_client -connect www.google.com:443 </dev/null 2>/dev/null | openssl x509 -outform DER > https.cer

3.2 pem转变格式为DER

证书有BASE64和DER两种编码,der二进制编码可以使用openssl进行转换。

  • 转变格式为DER
openssl x509 -outform der -in kncmpay.cer -out kncmpay.cer

3.3 Android不同版本对CA 证书权限的处理规则

Android 版本越高,HTTPS 报文越难抓

系统 CA 证书:基本拥有所有权限 用户 CA 证书:用户自行安装,权限很低

获得证书 ROOT 权限

1、直接 ROOT Android 手机,把 Charles 证书放到系统证书里,实现证书洗白 2、Android 7.0 以下:信任用户 CA 证书,可以简单的理解为我们安装的证书直接获得 ROOT 权限 3、修改Android的配置文件 res/xml/network_security_config.xml ,来控制网络安全:

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

release 包只信任 system 级别的证书, debug 包同时信任 system 和 user 级别的证书

see also