×

有关ssl-pinning的总结

96
秦砖
2017.11.06 20:25* 字数 1058

发现问题

在使用charles对FaceBook/Twitter进行抓包时,所有的请求最终都失败了。第一感觉是手机上安装的HTTPS证书被删除了,到设置中检查发现证书没有问题,手机上其它APP的https请求也能够正常抓取。看来应该是碰到新情况了,Google了下,了解到FaceBook/Twitter等应用使用了一种名叫ssl-pinning的技术来防止中间人攻击。

HTTPS

http与https

这张图比较形象地道出了HTTPS实际上是由HTTP协议与TLS协议组合而成的一个协议。
TLS协议作用于HTTPS建立前客户端与服务端通信建立信任的过程,其过程与TCP协议中的三次握手过程较为相似,有些同学可能会将二者混为一谈,注意二者本质上是完全不同的。
HTTP协议作用于客户端与服务端的正式通信过程,但二者通信的数据是被TLS协议最终生成的密钥加密过。


HTTPS建立的完整过程

客户端与服务端经过通信交换获得了三个随机数,通过这三个随机数,客户端与服务端能够使用相同的算法生成后续HTTP通信过程中对称加密算法使用的密钥。也就是说HTTPS协议中非对称加密只是在协议建立时使用,协议建立后使用的是对称加密。

中间人攻击

市面上的各种抓包软件的实现原理就是中间人攻击。TLS建立时客户端生成的随机数1、服务端生成的随机数2都是明文的,只有随机数据3使用非对称加密技术加密。中间人攻击的关键就是截获服务器返回的证书并伪造证书发送给客户端骗取信任,获取随机数3,进而达成盗取信息的目的。

那么客户端为什么这么容易被骗呢?客户端主要通过下面三种方式来校验证书的合法性:

  • 查看证书是否过期
  • 服务器证书上的域名是否和服务器的实际域名相匹配
  • 校验证书链

市面上大量的应用在证书检验方面做的都不够,还有很多的应用完全末做验证。而即使是完整的校验了整个证书链体系,中间人攻击同样还是可以通过在终端上手动添加信任根证书的方式发动。这也正是Charles/Fiddler等抓包软件在抓取HTTPS协议数据前,要求在终端上安装证书的原因。这个证书可以确保伪造的证书通过客户端的证书链校验。


中间人攻击

ssl-pinning

那么开篇提到的FaceBook/Twitter是如何做到防止Charles/Fiddler等抓包工具中间人攻击的呢?原来它是在开发时就将服务端证书一块打包到客户端里。这样在HTTPS建立时与服务端返回的证书比对一致性,进而识别出中间人攻击后直接在客户端侧中止连接。
ssl-pinning技术在AFNetworking中已经得到支持,参照这篇文章

突破ssl-pinning

有矛就有盾,开发者已经突破了ssl-pinning的限制达成了Facebook/Twitter的抓包需求。其实现的基本原理很简单,客户端不是会做两个证书间的一次性校验吗,那么就通过hook的方式将此次校验的结果返回true或者干脆不让其做校验。当然这种做法只能在越狱环境下实现,但对于抓包来说,这已经足够了。该方案已开源,其实现的基本原理在这篇文章中.

总结

没有破解不了的应用,只有破解成本高到无法承受的应用,愿这个世界更美好。。。。。。。

IOS开发随笔
Web note ad 1