锻炼吃饭的家伙

Charles的使用----抓取https数据包

2017-04-18  本文已影响274人  LoveY34

mac中的抓包工具据我所知有Charles(花瓶)、Wireshark,然后就不知道了😂,原谅我孤陋寡闻了。一般Charles用的比较多,使用起来也很容易上手,还有一点就是如果没有花钱购买的话仍然可以使用,只不过每次启动都要等10秒钟,使用半小时后就需要关闭重启(看到购买Charles使用需要的价格的时候,我觉得上面的10秒等待和半小时后重启还是可以接受的🤔,当然了我还是支持正版的啊!有闲钱的小伙伴可以考虑花点钱哦!)。

Charles启动的10秒 使用半小时就需要重启

说得简单点Charles的原理就是把Charles作为系统网络请求的代理服务器,这样就可以抓取到网络的数据包了,抓取电脑的数据包的时候直接打开Charles,选中macOS Proxy就可以抓取电脑的数据包了,抓取真机的数据包就需要设置手机的代理了,详细的操作可以看唐巧的Charles 从入门到精通(这里面说的蛮详细的)。

iOS开发的小伙伴都知道苹果现在已经提出项目中使用https与服务器交互了,现在还没有完全限制,但是后期肯定会收紧这个要求的,所以现在做好准备是最好的,适配的方法可以参考iOS 9 HTTPS适配
我公司项目适配完https后,客户端在与服务器调试接口的时候就比较麻烦了,本来使用http请求,使用charles抓取数据包就可以看相应数据结构了,服务器出错也可以看到错误信息,适配https后,抓取的数据让人懵,全是乱码,至少地球人看不懂。

请求数据报文
响应数据报文

Charles 从入门到精通里面有关于抓取https数据包的说明,但是我试了没有效果,头都大了。后来我查资料发现iOS开发过程中想要使用Charles抓取https数据包还需要修改代码,我使用第三方的AFNetWorking 3.1.0请求数据的,根据iOS 9 HTTPS适配里面的流程设置了·请求manager的securityPolicy:

//站点证书
NSString *cerPath = [[NSBundle mainBundle] pathForResource:SSL_CER_NAME ofType:@".cer"];
NSData *cerData = [NSData dataWithContentsOfFile:cerPath];
NSSet *cerSet = [NSSet setWithObjects:cerData, nil];

AFSecurityPolicy *securityPolicy = [AFSecurityPolicy policyWithPinningMode:AFSSLPinningModeCertificate];
//validatesDomainName 是否需要验证域名,默认为YES
securityPolicy.validatesDomainName = YES;
//添加证书
[securityPolicy setPinnedCertificates:cerSet];
//allowInvalidCertificates 是否允许无效证书(也就是自建的证书),默认为NO
//如果是需要验证自建证书,需要设置为YES
securityPolicy.allowInvalidCertificates = YES;
//设置manager的securityPolicy
httpManager.securityPolicy = securityPolicy;

如果想要适配https,但是还想要使用抓包工具抓取的话AFSecurityPolicy创建的类型就不可以是AFSSLPinningModeCertificate而是AFSSLPinningModeNone,前一个可能会验证证书而后一个不会,而且最好不要验证域名哦!

AFSecurityPolicy *securityPolicy = [AFSecurityPolicy policyWithPinningMode:AFSSLPinningModeNone];
//validatesDomainName 是否需要验证域名,默认为YES
securityPolicy.validatesDomainName = NO;
//allowInvalidCertificates 是否允许无效证书(也就是自建的证书),默认为NO
//如果是需要验证自建证书,需要设置为YES
securityPolicy.allowInvalidCertificates = YES;
//设置manager的securityPolicy
httpManager.securityPolicy = securityPolicy;

Duang!Duang!Duang!数据可以抓取到了,当然了抓到数据的基础还需要根据Charles 从入门到精通设置Charles,安装Charles Root Certificate。

请求数据报文
响应数据报文
注意啊!上述代码只适用于Debug,上线的时候还是需要把使用AFSSLPinningModeCertificate的,所以最好根据区分环境的宏把代码加到对应的宏判断里面,我是这么做的
#ifndef DIS_SERVICE
        //支持https(不校验证书,可以抓包查看)
        AFSecurityPolicy *securityPolicy = [AFSecurityPolicy policyWithPinningMode:AFSSLPinningModeNone];
        //validatesDomainName 是否需要验证域名,默认为YES
        securityPolicy.validatesDomainName = NO;
#else
        //站点证书
        NSString *cerPath = [[NSBundle mainBundle] pathForResource:SSL_CER_NAME ofType:@".cer"];
        NSData *cerData = [NSData dataWithContentsOfFile:cerPath];
        NSSet *cerSet = [NSSet setWithObjects:cerData, nil];
        
        //支持https(校验证书,不可以抓包)
        AFSecurityPolicy *securityPolicy = [AFSecurityPolicy policyWithPinningMode:AFSSLPinningModeCertificate];
        //validatesDomainName 是否需要验证域名,默认为YES
        securityPolicy.validatesDomainName = YES;
        //添加证书
        [securityPolicy setPinnedCertificates:cerSet];
#endif
        //allowInvalidCertificates 是否允许无效证书(也就是自建的证书),默认为NO
        //如果是需要验证自建证书,需要设置为YES
        securityPolicy.allowInvalidCertificates = YES;
        //设置manager的securityPolicy
        httpManager.securityPolicy = securityPolicy;

OK!这就是今天文章的全部了,有啥不同见解的欢迎评价!能打赏就更好了!😂谢谢!

参考文章:
1.让你的程序支持https以及https的抓包

上一篇下一篇

猜你喜欢

热点阅读