字节跳动Tiktok团队北上广深杭急招前后端开发,绿色内推邮箱:sunmaoyu@bytedance.com

安卓微信连接fiddler等抓包工具无法抓取https

问题描述:

在手机连接pc的fiddler后,安卓微信打不开https页面,安卓的浏览器、qq等都可以正常访问https,ios也都可以,就只有安卓微信放问https是空白页面

 

解决思路:

一. 证书没有正确安装

连接抓包工具无法访问https的,首先判断是证书问题。在浏览器访问  10.0.0.99:8888  ,点击最下面的证书进行安装

安装好证书后,发现仍然访问不了。

 

重新整理思路,安卓浏览器和qq等都可以正常访问https说明证书配置是正确的。唯独在微信访问异常,在百度后查到有其他人遇到类似的问题,说是证书链不完整,导致浏览器无法信任你安装的证书。

证书链其实就是描述证书的签名环节,就比如是 A 颁发证书给 B ,B颁发证书给C,然后我们手里的就是  证书C。当证书链不完整的情况下,也就是没有描述我们手中的证书C是由谁办法的,所以导致的浏览器不认为你这个证书是可信的授权证书。

二. 如何验证证书链是否完整?

1.  如果是外网,可以访问 https://www.geocerts.com/ssl-checker ,输入域名进行验证SSL证书链是否完整

 

2. 如果是内网,则可以使用命令验证:

openssl s_client -connect    x.x.x.x:443

// s_client为一个SSL/TLS客户端程序,与s_server对应,它不仅能与s_server进行通信,也能与任何使用ssl协议的其他服务程序进行通信。
// -connect host:port:设置服务器地址和端口号。如果没有设置,则默认为本地主机以及端口号4433。

 连接内网的IP后:

 

其中0、1是证书链中每一级证书的序号。0是要被验证的网站所用的证书。其CN对应网站域名。

每一个序号后面,s 开头的一行是指证书,i 开头的一行是指此证书由谁签发。

0 的CN包含一个英文域名 static.xxx.com 。它的签发者是 TrustAsia Technologies, Inc./OU=Symantec Trust Network/OU=Domain Validated SSL/CN=TrustAsia DV SSL CA 

1 的证书就是0的签发者。而1自己又是由另一个证书  VeriSign Class 3 Public Primary Certification Authority  签发的。

 

所以这么一级级看下来,浏览器认为,1的签发者我认识,安装包里有提到,VeriSIign嘛。签名正确、验证无误,所以信任1。那么也应该信任1签发的0。所以这个网站可以信任。

然而,如果网站配置时,在crt文件中只包含了自己,而没包含一个完整到可以被浏览器内置数据验证的证书链,就有可能被浏览器拒绝。比如

openssl s_client -connecttouko.moe:443 

---

Certificate chain

 0 s:/CN=touko.moe

   i:/C=CN/O=WoSign CALimited/CN=WoSign CA Free SSL CertificateG2

---

只有0一组。说明s行中的touko.moe由 i 行中的WoSign CA Free SSL CertificateG2签发。没了。

 

这就是此坑最神奇之处:浏览器此时是否验证失败,是不一定的。有2种情况:

A、浏览器自安装以来,从未见过这个i。那么验证会失败。

B、浏览器以前见过、并且验证过i,那么验证会成功。

 

通常管理员自己会去证书发行商的https网站买证书,浏览器就会验证,然后将验证成功的中间证书全都缓存下来,为以后节省时间。当管理员(错误地)配置完自己的网站,去浏览测试的时候,完全不会遇到问题。因为他的浏览器已经认识这个中间证书了。

总结:

通过证书链验证发现,我们内网的证书链是完整无误的。

 

三. 微信自己的问题

再次整理思路,用安卓微信访问其他的https网站比如百度、csdn等都是空白页,如果是我们的证书链问题,那其他网站的证书链是应该没问题的,为什么也访问不了?所以证书链问题完全排除掉。

那既然不是本地证书问题,也不是我们服务端证书链问题,qq、浏览器又都能正常访问,ios也正常,说明fiddler端是没问题的,这个时候怀疑是不是微信自己的问题?

OK,那首先考虑为什么fiddler可以抓取https的包呢?

fiddler巧妙就巧妙在伪造CA证书的地方了,我(fiddler)自己编造一个私钥和公钥,作为签名凭证发送给浏览器,提交到服务端,服务端根据公钥签名返回,我(fiddler)伪造的密钥,自然就能解开了。

所以,你知道,我知道,大家都知道,为了防止软件被fiddler抓包,开发者会内置SSL证书,直接通过自己的证书签名加密,而不去采用系统的CA证书,这样就不会被伪造的证书来骗取信息,自然而然,fiddler就没办法抓到这些自带证书的软件数据了。

而微信极有可能自带https证书验证,没有使用所以fiddler没办法抓到微信内https网页的信息。

 

而之前的微信是可以正常抓取https的,今天却突然不行,想到前两天微信刚刚升级到了7.0,会不会是新版新增的限制呢?

于是找来安卓6.7.3的微信进行验证,发现时正常的,只有最新版7.0不行。

 

经过上面一系列的验证,大概可以猜测,是因为安卓的微信7.0版本值信任自己内置的ssl证书,不信任用户自己安装的证书,导致抓包工具抓取https页面时,访问空白!

 

解决方案:

在官方没出来新的调试工具和方法之前,使用http或者低版本微信进行调试

 

-----------------------------------------

参考文章:

https://www.dadiaoge.com/fiddler-wechat-https.html

https://blog.csdn.net/u014145985/article/details/80997023

https://blog.csdn.net/qq_24033949/article/details/52891146

posted @ 2019-01-08 17:10  冒雨ing  阅读(12392)  评论(0编辑  收藏  举报