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

前言

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

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

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

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

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

I 抓包装备

1.1 iOS侧的署理装备(默许不支撑阻拦SSL数据)

  • 把 iOS 的网络包转发到署理 IP 和署理端口的装备

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

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

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

  • 查看 Mac地址
    iOS小技能:Charles抓包【应用场景:App联调测试】(绕过Certificate Pinning的方案)
    或许运用ifconfig查看IP
	inet 192.168.1.107 netmask 0xffffff00 broadcast 192.168.1.255

Charles 的署理端口号能够从Charles -> Proxy -> Proxy Setttings进行查看和更改。端口默许是 8888

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

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

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

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

或许直接拜访charlesproxy.com/charles.crt… 证书,能够挑选先发证书到邮箱,再从体系邮箱挑选装置

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

设置->通用 -> 挑选对应的描绘文件进行装置信赖刚刚下载的证书。

1.3 iOS端信赖证书的办法

  • iOS 信赖证书
iOS10.3.1 新装置的证书需求手动挑选信赖证书。
处理方式:
设置->通用->关于本机->证书信赖设置
  • 运用场景:iOS10.3.1 新装置的证书需求手动挑选信赖证书。

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

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 文件

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

  • 计划2:假如没有公钥证书和随之配套的私钥,这个时候当然能够采取逆向的手段来绕过证书校验

计划2:凭借逆向手段来绕过证书校验

  • ios-ssl-kill-switch tweak:github.com/zhangkn/ios…

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

  • ssl-kill-switch2:Blackbox tool to disable SSL certificate validation – including certificate pinning – within iOS and OS X Apps
  • objection/hooks/ios

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

  • how to properly setup security connection 1、iOS安全【 SSL证书验证, 让Charles再也无法抓你的恳求数据】2、iOS逆向:【绕过证书校验】

  • 1、iOS网络安全优化:SSL证书验证, Charles再也无法抓你的恳求数据;对恳求参数进行签名;2、不走全局proxy的计划;3、允许不验证SSL证书;4、阻拦恳求;5、DoH &DoT6、SDL