引言
起因:帮助别人解决问题,给我发来了这么一段内容:
在客户端安装并信任第三方证书通过中间人数据抓包可以解密HTTPS 加密流量,获取交易登陆身份认证等流量的明文信息,存在隐私泄漏风险,涉及组件:okhttp。
漏洞危害:在android 上通过浏览器点击可以安装证书。如受害者使用恶意的无线网络,并被诱导安装了根证书,同样存在将SSL 流量被解密的风险,进而窃取交易密码等敏感信息。
1. 漏洞解释
上面引言部分是检测机构写的报告中的部分,像老奶奶的裹脚布一样,又臭又长,我也是看了半天才看懂。
1.1 解释
如果用户被恶意网络诱导安装并信任了某个证书,而这个网络中持有这个证书的某个恶意程序就可以充当中间人的角色,在建立ssl连接的时候就可以劫持用户流量,获取到一些关键信息。
1.2 前提
这里需要注意的是,中间人的角色需要伪造为服务器端。如果服务器开启了双向验证,那中间人是劫持不了的,不过一般都不会开双向认证,除非真的有必要。
- 未开双向认证
- 未做证书绑定
2 解决方案
这个漏洞我们的解决方案是证书绑定,把服务器证书预置到本地,校验服务器证书环节去比较,不一样就抛出证书校验出错异常,在网络请求的回调中就会走Error,在Error回调中去统一处理。
2.1 代码说明
本地使用了鸿洋的http请求库:okHttpUtils
okhttp相关文章:okhttp相关文章
因为原先的HttpsUtils
代码中是忽略处理的,所以我们需要把源码放到代码中,然后修改使用。
2.2 okHttpUtil代码处理
在
checkServerTrusted
方法中取出证书链中对应网站的证书(也就是第一个),和预置的证书去判断是否相同,如果不同则抛出异常。
这里可以不校验证书,只校验证书的部分信息(其实,安装了openssl环境的话,基本上所有服务器的ssl证书都能拿到,所以安全性问题不存在的~~)
2.2.1 openssl获取服务器证书
这里不作说明,自行百度
2.3 客户端代码处理
因为懒,所以截个图吧.
1. 在启动的时候给httpClient
设置sSLSocketFactory
,用来去校验服务器或者客户端证书(如果服务器证书是CA的话,你不做证书绑定校验,是会默认通过的,因为你的证书链中是认证过的了)
2. 把服务器端证书导出为PEM格式,以常量形式预置到客户端,然后解析为Certificate
对象,在校验时使用。