通常的https请求是这样的
这个过程可以使用SSL加密/TLS加密来实现,我们先简单地了解一下这个通信的过程,会对了解SSL pinning有所帮助。主要是了解证书发送的过程。
为什么能通过Charles能抓包?
当移动应用程序与服务器通信时,它们通常使用 SSL 来保护传输的数据免受窃听和篡改。默认情况下应用程序中使用的 SSL,只要服务器具有操作系统信任库信任的证书,都是默认为安全信任的(证书为操作系统附带的证书颁发机构列表)。
Charles能够抓包主要依靠的是以下几个步骤:
- 在建立通信的中间过程中,服务器把CA证书发给mobile的时候,会被Charles拦截(这里已经拿到服务器的公钥了),并替换成Charles包装好的带着自己公钥假的CA证书,再发给mobile。
- mobile拿到包装好的Charles假证书,在本地系统的证书列表校验通过之后,会拿着证书里面的公钥加密对称密钥,发给服务器。
- 发给服务器的时候又被Charles拦截了,它用自己的私钥解密,得到mobile的对称密钥。再用步骤1得到的服务器公钥加密自己生成的假的对称密钥,发给服务器。
- 就依靠前面几步建立通信,然后之后的每一次通信都会被中间挟持。
这也是为什么一开始使用Charles抓包的时候,是需要安装并且信任它的证书的原因。
大概是这样:
简单来说,就是证书被替换了,中间通信的时候被挟持,Charles和服务器建立通信之后用的是Charles的对称公钥在通信,而Charles和mobile建立通信之后用的是mobile的对称公钥在通信,像这样
SSL pinning是怎么避免中间人攻击
使用 SSL pinning,应用程序可以先配置证书在本地,每当发起网络请求建立连接到服务器时,它都会先把拿到的服务器证书与本地的固定证书进行比较,当且当它们匹配的时候,才会认为这个服务器是受信任的,并建立 SSL 连接。
证书校验失败大致过程如下
简单来说,就是服务器必须返回带有mobile预置好的证书,才能通过本地证书的校验,不然是建立不了通信的。
Reference documents
https://www.huaweicloud.com/zhishi/ssl003.html
https://www.guardsquare.com/blog/ios-ssl-certificate-pinning-bypassing