https适配及https抓包

关于苹果的碎碎念

苹果在 WWDC 2016 上宣布:2016 年底将要求所有 APP 适配苹果的 App Transport Security,简单的来说就是app上的所有明文请求都需要由http请求变成https 请求,如果没有适配且没有进行必要的说明,那么就会审核不通过。不过,就在前不久苹果怂了(我猜的!),将这个deadline无限期推迟,我能说什么呢,当然是好开心!

适配https

言归正传,关于什么是https,https的原理啥的网上资料很多,在这里我就不多重复了,有兴趣的可以去查阅相关资料。下面就来说说我在适配时遇到的一些问题。

1 . 证书相关

适配https,首先我们需要的就是证书。那么如何拿到证书,一种是让后台大哥要,或者你懒得要那么也可以自己去下一个,以百度为例,用Safari打开https://www.baidu.com

百度网址

点击那个小锁,打开显示证书,将baidu.com这个证书拖到桌面就可以获得证书了。同理将百度换成你们app的域名就可以了。
证书详细

那么获得了证书,然后呢,直接拖进工程吗?不,首先我们要确认一下,这个证书是什么类型的证书,证书目前分三种:

  • 自建证书
  • 免费证书
  • 收费证书

自建证书不在苹果的信任列表里,需要拖进工程进行双向认证,而剩下两种都是由第三方机构颁发的,都属于苹果的信任列表里,是不需要拖进工程里的。注意:苹果将沃通和StartCom的根证书列为不信任

苹果不再信任沃通和StartCom证书

如果有同学发现自己的证书在ios9上可以用,在ios10上不可以用时,那么你就要看看你的证书的根证书是什么了,建议就是换一家证书颁发机构,免费的阿里云,腾讯云等都可以。
如何验证证书是否可行,用nscurl命令就可以了,全部pass就表示没问题

nscurl --ats-diagnostics --verbose https://example.com

如果你是申请的第三方证书,恭喜你,改改域名就可以了。如果是自建证书,那么你还要继续。

2 . 代码适配

自建证书,那么要辛苦一点,把下载下来的.cer证书拖进工程里面,然后配置一下,以AFN为例:

NSString *cerPath = [[NSBundle mainBundle] pathForResource:@"serve" ofType:@"cer"];
NSData *cerData = [NSData dataWithContentsOfFile:cerPath];
NSSet *cerSet = [NSSet setWithObjects:cerData, nil];
AFSecurityPolicy *securityPolicy = [AFSecurityPolicy policyWithPinningMode:AFSSLPinningModePublicKey];
securityPolicy.allowInvalidCertificates = NO; // 如果需要验证自建证书,需要设置为YES
securityPolicy.validatesDomainName = NO; // 是否需要验证域名,默认为YES
// 添加证书 [securityPolicy setPinnedCertificates:cerSet]; 
AFHTTPSessionManager *manager = [[AFHTTPSessionManager alloc] init]; manager.securityPolicy = securityPolicy;

关于AFSSLPinningMode这个属性,有三个选项:

  • AFSSLPinningModeNone:完全信任服务器返回的证书,默认选项,选了这个你托证书进来也没啥意义了
  • AFSSLPinningModePublicKey:对比你本地的证书和服务器返回的证书是否完全一样
  • AFSSLPinningModeCertificate :对比你本地的证书和服务器返回的证书的public key是否一样。

选哪种模式好呢?

  • AFSSLPinningModeCertificate:比较安全,但是也比较麻烦,你的证书过期了,那么你就要出一个新版本的app并且旧版本的就不能用了,当然你也可以每次启动时来通过一个接口来查询是否有新的证书。
  • AFSSLPinningModePublicKey:只对比public key,即使服务器的证书变了,只要public key不变,一样可以通过验证
    所以,如果你确保每个使用者都是使用的最新的app,就用AFSSLPinningModeCertificate,不是的话,选择AFSSLPinningModePublicKey比较好。

https抓包

用Charles抓包在开发中是很方便的,尤其在跟后台的同学交流过程中起到比较重要的作用。但是在完成https之后,我们再抓包,发现抓到一堆乱码,是不是很坑爹,没事,接下来我们就解决它。

1 . Charles设置

首先现去下载最新版的Charles,因为我用旧版没成功(估计是我没重启/斜眼笑),官网和网上的破解版都可以。

Charles设置1

给模拟器和系统安装这两个证书,打开钥匙串,设置证书为始终信
证书设置信任

在Charles里添加端口号443
设置的端口号

重启模拟器(重要的一步),然后就可以抓包了,如果还不行,重启电脑。

2 . 手机设置

先用手机设置代理连上Charles,然后用Sarfari打开http://charlesproxy.com/getssl这个网址,然后手机会自动下载安装证书,安装成功后,就可以在真机上抓包了。

还有一些白名单设置,因为政策还没出,所以那些就以后再补充了

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容