安卓微信连接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