一、原理
对客户端伪装成服务器,截取客户端发送给服务器的请求,然后伪装成客户端和服务器进行通信
对服务器伪装成客户端,截取服务器返回给客户端的消息,然后伪装成服务器和客户端进行通信
https的安全性:与http相比,https加了SSL/TLS协议
安全性体现:数据的保密性(防窃听)、数据的完整性(防篡改)、通信双方的真实性(防冒充)
1、数据的保密性
对称加密:加密和解密使用同一个密钥的加密方法。安全性不够,适用于安全性要求低,数据量大,数据传输速度要求高的情况。常用方法:DES、3DES、RC2、RC4、RC5、IDEA等
非对称加密:加密和解密使用不同密钥的加密方法,即两个密钥:公钥和私钥。使用私钥加密就用公钥解密,使用公钥加密就用私钥解密。安全性更高,效率低,传输速度慢,适用于小数据。
基于对称加密和非对称加密的优缺点,https的加密方式即:
- 客户端向服务端发送请求(发送TLS版本号,支持的加密方式,随机数Client Random)
- 服务端返回非对称加密的公钥(证书),商定的加密算法,随机数Server Random
- 客户端验证证书
- 验证通过->客户端生成随机数pre-master,使用公钥加密数据->发送到服务端,服务端使用私钥解密,获取随机数pre-master。此时,二者共享三个随机数。客户端根据证书、三个随机数生成一个会话密钥(对称加密)
- 客户端用公钥加密会话密钥,发送给服务端
- 服务端用私钥解密,获取会话密钥
- 客户端和服务器互相传输加密的握手消息来验证安全通道是否已完成
总:连接过程中使用非对称加密(获取证书和三个随机数生成会话密钥),传输过程中使用对称加密(用会话密钥)
2、数据的完整性
问题:传输过程中截取数据,使用其他加密方式篡改数据,再传输回去。
解决方法:数字签名。使用Hash算法将任意长度的字符串转为固定长度的字符串(不可逆,可检验完整性)
过程:
- 服务器使用Hash算法对数据提取定长摘要
- 使用私钥对摘要进行加密,作为数字签名
- 将数字签名和数据一起传给客户端
- 客户端使用公钥解密,得到摘要A和数据
- 客户端使用Hash算法对数据提取摘要B
- 对比摘要A,B即可得到数据是否被篡改
3、通信双方的真实性
问题:公钥、私钥可以被攻击者提供,即数据会暴露在攻击者面前
解决方法:数字证书(签名)。数字证书就是数字认证机构CA加在数字身份证上的一个签名,证书的合法性可以向CA验证。任何人都可以制作证书,但只有权威机构的才可以被CA认证。CA认证就是确认这个服务器是否是可信任的。
证书包含内容:证书颁发机构,颁发签名,版本、有效期,绑定的服务器域名,签名使用的加密算法,公钥
验证过程:
- CA:CA对证书内容进行Hash计算,使用私钥加密,得到Certificate Signature,将其添加到文件证书上,形成数字证书。
- 客户端:客户端使用Hash算法得到该证书的Hash值A,使用CA的公钥解密Certificate Signature得到Hash值B,比较A、B,相同即合法。
- 连接时会先验证服务器证书的合法性,证书不合法即终止连接,并提示证书不安全。
Charles策略:
Charles拦截服务器给客户端的公钥(证书),换成自己的,借此冒充。但无法通过CA认证。
通过CA认证方法:
在机器上安装Charles的根证书并设置为始终信任。这样机器上就多了一个CA公钥,那么后期CA伪造的公钥(证书)就能通过验证。
https抓包流程:
- 客户端服务器建立连接,charles拦截服务器返回的证书(公钥)
- charles伪造证书(公钥)发给客户端
- 客户端信任
- 客户端生成会话密钥,用charles证书(假公钥)加密,传输
- charles拦截,用charles私钥解密,得到会话密钥,再用真公钥加密,传输给服务器
- 之后数据都可以用会话密钥解密
- charles也可以在中途对数据进行篡改
- 服务器返回信息时,也是类似流程
防抓包:针对证书校验
AFN
一、主界面
分类:
Structure:将网络请求按照url分类
Sequence:将网络请求按照请求时间分类
过滤:
filter:输入URL过滤词条
Proxy->Recording Settings:include中add想抓取的目标网站的封包
focus:选择已抓取的、想访问的网站右击,点focus,过滤出该网站的网络
二、配置
PC端:
Proxy->Mac OS Proxy将Charles设置为系统代理
检查wifi代理,默认情况下网页代理(HTTP)和安全网页代理(HTTPS)选项中网络代理服务器显示为127.0.0.1,端口为8888
设置自动代理会导致无法捕捉chrome和Firefox浏览器的请求
移动端:
1、Proxy->Proxy Settings:输入端口号8888,勾选Support HTTP/2和Enable transparent HTTP proxying
2、从help->local ip address获取现存的IP地址
在手机上wifi设置,设置代理->手动代理,输入IP地址和端口号8888
3、安装信任证书
PC:help->SSL Proxying->Install Charles Root Certificate打开钥匙串,安装charles证书,将其设置为始终信任
两年过后过期:Reset Charles Root Certificate
移动端:help->SSL Proxying->Install Charles Root Certificate on a Mobile Device or Remote Browser
上述有移动带网络代理应当设置的IP地址和端口号,以及证书下载地址
设置代理后,PC端会弹出是否允许连接:允许连接
移动端下载证书地址:chls.pro/ssl
安装并信任证书:
安卓手机:设置-安全-更多安全设置-加密和凭据-从存储设备安装-证书的路径
ios:设置-通用-关于本机-证书信任设置
三、使用
1、重复请求:
选择想要的请求右击、选择Repeat或者Repeat Advance
Repeat:单次重复请求
Repeat Advance:设置多线程请求的线程数和间隔时间
2、模拟弱网
Proxy->Throttle Settings:勾选Enable Throttling(Throttle 节流阀),然后可以设置Throttle Preset,指定具体要求的kbps或3G、4G网络
3、修改请求和响应
Map:适合长期的将某一些请求重定向到其他的网络地址或本地文件
Tools->Map Remote/Map Local
Map Remote:网络重定向的原地址和目的地址,没有的限制条件可以空着。例子:分别是线上地址,线下测试地址(重定向至)
Map Local:输入网络重定向的原地址,和重定向的本地文件地址
问题:返回的HTTP Response Header和正常的请求不一样,如果检验Header里的内容,就会失效
解决办法:Rewrite修改HTTP头
测试过程中,一般有线上线下两套环境,app使用的线上的,可以通过Map重定向到线下的环境,在线下环境进行测试。也可以用Map Local修改响应结果。
Rewrite:适合对网络请求进行一些正则替换,批量和长期替换
用于修改请求或者返回结果的Body或header内容,支持正则表达式
Rewrite和Map结合使用,先重定向再修改请求头或返回结果,注意在Map中勾选Preserve host in header fields,否则Rewrite无法命中。
Breakpoints:做临时性的修改,短期临时替换一次
类似于Xcode设置的断点,当设置Breakpoints后,指定的网络请求再次发生时,charles截获该请求。
右击->选择Breakpoints
Repeat一次,截获请求,打开Breakpoints调试面板,用add临时修改网络请求的请求/返回结果,点击Execute执行
4、反向代理
Proxy->Reverse Proxies Settings->勾选Enable Reverse Proxies->add
允许将本地端口映射到远程端口,下方将本地54362端口映射到ww.baidu.com的80端口,以后访问本地的54362端口,其服务和返回结果将会由原程端口提供。