HTTPS 抓包原理以及 Android 端如何防止抓包

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了HTTPS 抓包原理以及 Android 端如何防止抓包相关的知识,希望对你有一定的参考价值。

参考技术A 抓包的基本原理就是中间人攻击 HTTPS 的握手过程 。Mac 上可使用 Charles 进行抓包。本质上就是两段 HTTPS 连接,Client <--> Man-In-The-Middle 和 Man-In-The-Middle <--> Server。使用 Charles 进行抓包,需要 Client 端提前将 Charles 的根证书添加在 Client 的信任列表中。

回顾之前的 HTTPS 的握手过程 ,可以知道 SSL 的核心过程就是客户端验证证书链合法性——客户端检查证书链中是否有一个证书或者公钥存在于客户端的可信任列表中。
手机系统中内置了上百份不同的根证书。Certificate Pinning 的原理其实就是 app 中内置需要被信任的特定证书,app 在验证服务器传过来的证书链时,使用这些特定证书来验证的。

证书的主要作用是公钥的载体,但在实践中我们更多是去 pinning 公钥, SubjectPublicKeyInfo(SPKI) 。这是因为很多服务器会去定期旋转证书,但是证书旋转后,证书中的公钥还是相同的公钥。

如果私钥泄露了,那么服务器端就不得不使用新的私钥做出新的证书。客户端为了预防这种情况,可以提前 pinning 这些新的证书。这样,当服务器替换新的证书时,客户端 app 就可以不做任何改动。

从 SDK 24 开始,android 支持通过 xml 来配置 certificate pinning,见 Network Security Configuration 。

其中 <pin> 节点接受 SubjectPublicKeyInfo 的 hash 值。

OkHttp 从 2.1 开始直接支持 Certificate Pinning 。

我在项目实践中发现有的服务器并不会在 ssl 握手阶段 将完整的证书链传输过来——只会传证书链中的根证书和叶子证书。如果安卓系统中使用 HttpUrlConnection 访问服务器,抛出如下类似异常:

但是浏览器对于这种缺失中间证书的服务器却能验证通过,主要原因是浏览器访问有完整证书链的网站时,如果发现证书链中有浏览器没有内置的中间证书,那么浏览器会将该证书缓存下来,这样浏览器访问其他没有该中间证书的服务器时,就可以使用这个缓存的中间证书来验证证书链。
解决安卓上出现这个问题的方法是将这个中间证书通过 app 添加到信任证书列表中。我们需要将该中间证书加入到 App 运行时所用的 TrustManager 中。

使用 X509TrustManagerExtensions 可以将证书 pinning 到 app 中。 X509TrustManagerExtensions.checkServerTrusted() 允许开发者在系统对证书链验证通过后,再次使用自己的方法验证证书链。

使用方法如下:

vue-cli建立的项目如何在手机端运行以及如何用charles来抓包

刚开始自己在config文件夹下的index.js中的dev下的host写成的是localhost,但是发现自己不能在手机端访问,并且也不可以在charles进行抓包处理,后来把localhost改成自己的电脑的ip就可以了!

对于抓包,其实先下载charles来安装,然后对于安卓手机选择自己的wifi,如果之前已连接的话,先断开,重新连接,不过先不要输入wifi密码,勾选高级选项,选择“代理”为手动,并且填写自己的服务器主机名为电脑ip地址,至于服务器端口的话,charles默认是8888端口,所以你填写那个就行了,然后输入密码就可以了,这时候启动charles,在手机端输入vue-cli项目地址,即可!

以上是关于HTTPS 抓包原理以及 Android 端如何防止抓包的主要内容,如果未能解决你的问题,请参考以下文章

Charles抓包以及解决抓取HTTPS请求unknown的问题

Charles 手机抓包HTTPS设置以及证书安装

移动端https抓包那些事--初级篇

实操!使用Fiddler在Android手机上对https请求抓包 !

使用Charles对Android 进行HTTP抓包

四连问:前后端分离接口应该如何设计?如何保证安全?如何签名?如何防重?