iOS - Charles抓https的包(双向认证)

最近为了配合测试来抓公司做的app的包,研究了下如何抓https,讲一下遇到的坑。

! 强调下Charles 版本 v4.0.1

正常抓包,网上很多,随便搜索下一就能搜索到

类似 配置下 ip 端口 启用下ssl 信任下花瓶的证书 就抓到了。

问题

可是自家公司做的app ,就算配置了ip及端口,启用了ssl,信任了证书,怎么抓都还是乱码。

  • 坑点一: 网上几乎所有教程都没让导入自己客户端的私钥,研究下发现,因为双向认证,所以需要把客户端的私钥 导入到Charles中。
    Proxy -> SSLProxying Setting -> Cilent Certificates 点击add 输入需要用到秘钥的ip 端口 点击choose 选择对应的p12 文件,导入进去就好了 (在抓包过程中,如果密钥有密码 就会提示输入密码)

  • 坑点二: 在上述配置设置完成后,满心欢喜的准备成功抓包,结果依旧抓不到包,启动了抓包后,所有接口都调用不成功,看了下红色感叹号里面的报错信息,You may need to configure your browser or application to trust the Charles Root Certificate ,本人英语不太好,但是勉强还能看的出他是让我信任 Charles Root Certificate,问题来了,我一开始就信任了啊!(虽然很简单,还是说下,信任的方式当然是手机访问chls.pro/ssl 把证书装上了)。多方研究,发现是网络层对服务端证书做了非常严格的校验,Charles的证书说什么都不认。
    原因是这段代码 底层用的是AFNetwork

+ (AFSecurityPolicy *)securityPolicy
{
    AFSecurityPolicy *securityPolicy = [AFSecurityPolicy policyWithPinningMode:AFSSLPinningModeCertificate];
    [securityPolicy setAllowInvalidCertificates:NO];
    [securityPolicy setValidatesDomainName:YES];
    return securityPolicy;
}

仔细看了下这个枚举

typedef NS_ENUM(NSUInteger, AFSSLPinningMode) {
    AFSSLPinningModeNone,
    AFSSLPinningModePublicKey,
    AFSSLPinningModeCertificate,
};

AFSSLPinningModeNone: 代表客户端无条件地信任服务器端返回的证书。
AFSSLPinningModePublicKey: 代表客户端会将服务器端返回的证书与本地保存的证书中,PublicKey的部分进行校验;如果正确,才继续进行。
AFSSLPinningModeCertificate: 代表客户端会将服务器端返回的证书和本地保存的证书中的所有内容,包括PublicKey和证书部分,全部进行校验;如果正确,才继续进行。
AFNetWork SSL参考网址

如此就真相大白了,只要把他去去掉就完事了。(我的处理方式是在debug模式下,不启用这句话)这样测试正常抓到https的包了!

如果大家遇到其他的坑的话, 具体详情可以留言交流。

你可能感兴趣的:(iOS - Charles抓https的包(双向认证))