最近在开发一个钱包应用,为了安全,和服务器的通信都是使用https,使用https的时候,会有两个问题,第一个是抓包问题,第二个是安全问题,本文会尝试讨论一下相关问题的解决方法。
抓包问题的解决
调试问题主要分为 https 如何抓包,这个在 mac 上使用 charles,windows上使用 findler,本来这个没啥好写的,但是因为在 Android 上搞了几个小时才搞定,所以记录一下遇到的坑。
先来看看效果,下图的火币app的请求
下图是微信的请求,微信有的数据有特殊的格式,不是明文
再看一个微信的明文请求
android上遇到的坑
网上大部分的流程如下:
-
mac 安装 charles 证书
-
mac 上信任证书
-
这时候已经可以抓本发送的https请求了,设置一下 macOS Proxy
由于我们想抓手机或者远程机器的https,所以还需要设置一下远程的机器信任 Charles 证书
-
把 Charles 设置为 http,socks 代理
-
设置 Charles 拦截的 https 模式
电脑和手机都连接到一个网络
-
手机设置代理,地址就是刚才 Charles 那边设置的
由于Android每个牌子的手机设置方法不一样,不知道的可以去网上搜。
- 手机安装 Charles 证书
这一步也比较坑,我是通过 android studio 把证书文件推到手机的,也可以用adb push。
推到手机手,我的小米手机并不能安装,需要开启一个叫“文档”的应用,具体方法看这个连接
开启“文档”应用后,就可以“设置 > 更多设置(系统和设备) > 系统安全 > 从存储设备安装”
按照道理,这一步走完,完全应该可以抓到手机https的请求了,但是我的小米mix2是不行的。
-
App 内配置信任 Charles
由于我的 App 不知道是什么原因,https 经过Charles后,一直会显示没有配置证书,我怀疑是我的 App 是只支持 Android6 以上,而这个版本以上是不会默认信任系统证书的,所以我只能去在App里面设置信任Charles。这一步如果哪位大神明确知道原因请留言告诉我。
至于如何在 App 内部设置使用 Charles 证书,请看这个文档: security-config
这下终于成功了。。。
Certificate Pinning
使用 https 的 App,往往还需要设置一个 Certificate Pinning,可以进一步增强安全性,基本原理就是,App只信任特定的证书,这样像 charles 这样的中间人就没法劫持数据了。
设置方法可以看如下文档。
https://www.owasp.org/index.php/Certificate_and_Public_Key_Pinning.
android是需要增加一个network_security_config.xml文件。上面security-config的链接里面也有说明。
总结
本文说明如何调试https请求,并用Android的一个App做为demo说明如何配置。最后给出了一个增强安全性的方案,增加Certificate Pinning。
Charles和Findler这一类工具还可以做更多的功能,比如模拟网络很慢的情况,修改发送的数据,性能测试等,是安生立命的好东西 :)。
参考文档
https://www.charlesproxy.com/
https://developer.android.com/training/articles/security-config
https://segmentfault.com/a/1190000011573699
https://jingyan.baidu.com/article/acf728fd733db9f8e510a395.html