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

HTTPS 抓包原理以及 Android 端如何防止抓包,第1张

抓包的基本原理就是中间人攻击 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 从 21 开始直接支持 Certificate Pinning 。

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

但是浏览器对于这种缺失中间证书的服务器却能验证通过,主要原因是浏览器访问有完整证书链的网站时,如果发现证书链中有浏览器没有内置的中间证书,那么浏览器会将该证书缓存下来,这样浏览器访问其他没有该中间证书的服务器时,就可以使用这个缓存的中间证书来验证证书链。

解决安卓上出现这个问题的方法是将这个中间证书通过 app 添加到信任证书列表中。我们需要将该中间证书加入到 App 运行时所用的 TrustManager 中。

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

使用方法如下:

这个很简单,直接在电脑上安装抓包软件wireshark,将电脑与路由器连接好,点开wireshark,开始采集,此时界面会弹出一个小窗口,需要你选择要抓包的网卡,你应该选择与路由器互联的网卡。准备就绪,直接登录web界面,wireshark会抓取到所有从选定网卡收发的报文了。

DABAN RP主题是一个优秀的主题,极致后台体验,无插件,集成会员系统
网站模板库 » HTTPS 抓包原理以及 Android 端如何防止抓包

0条评论

发表评论

提供最优质的资源集合

立即查看 了解详情