关于苹果的碎碎念
苹果在 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的根证书列为不信任
如果有同学发现自己的证书在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里添加端口号443
重启模拟器(重要的一步),然后就可以抓包了,如果还不行,重启电脑。
2 . 手机设置
先用手机设置代理连上Charles,然后用Sarfari打开http://charlesproxy.com/getssl
这个网址,然后手机会自动下载安装证书,安装成功后,就可以在真机上抓包了。
还有一些白名单设置,因为政策还没出,所以那些就以后再补充了