iOS APP强制HTTPS最正确姿势—启用App Transport Security

关于各大媒体指出2017年1月1日起苹果将强制启用ATS、强制HTTPS协议的新闻层出不穷,也让开发者们开始恐慌。网上的解决方法也是眼花缭乱的,笔者没有发现一个比较全面的解决方案,也是够了。
首先,肯定是不要慌,虽然苹果在全球开发者大会(WWDC)上宣布称,公司希望官方应用商店中的所有iOS APP都使用安全的HTTPS链接与服务器进行通信。不过,苹果官方也只是谈到这个问题并给出建议性方向,关于会不会导致已经上架的APP下架或无法正常运行,你就不用担心了,官方并未正式通知,请参考官方新闻:Apple-News and Updates(补充:苹果官方已经宣布推迟强制使用ATS,以便有大家更多的时间进行准备更改:Apple-Supporting App Transport Security
其次,虽然苹果官方并没有给出明确的通知,但是苹果WWDC上的表态,可以明确告诉你,关于之前的直接在项目中禁用ATS方式(App Transport Security Settings->Allow Arbitrary Loads设置为YES)已经过去了,官方已经指出,不管你怎么设置Allow Arbitrary Loads,苹果都将默认将其设置为NO,也就是一定要启用ATS。所以趁还有一点点时间,赶快改过来,不要设置Allow Arbitrary Loads,或者将其设置为NO。
那么问题来了,启用ATS,也就意味着:

1. 之前的HTTP请求无法使用了,想办法仍然支持HTTP协议,并且不影响APP上架。
2. 必须要支持HTTPS协议-使用证书。证书也包括自签证书和公信机构颁发的证书,也就对应着两种解决方案。
一、如果没有证书,如何紧急应对审核?

如果没有证书,那么就要熟悉苹果此次的官方意图,就是所有APP必须启用ATS,但是如果你或贵公司还是由于各种原因不愿意使用HTTPS协议,那么通过认真诚恳的态度,并且提交审核的时候说明你的理由,还是可以通过苹果审核的,那就是在Xcode->info.plist文件中添加必要的设置,让只支持HTTP的域名允许通过不安全的HTTP连接。废话不多说,直接看图:

82870B3B-2022-4959-99A4-ECBE3FC5BBA3.png

Exception Domains就是你要告知苹果的特殊域名,在这里,你就可以添加只支持HTTP的域名,并且一定要设置允许HTTP协议的属性NSExceptionAllowInsecureHTTPLoads为YES。包括Web域名,也是同样的设置,如果没有特殊需求,暂时不用考虑其它各种属性的设置。以下是苹果官方说明:Apple-NSAppTransportSecurity

91ABB2B9-B515-4F7F-8175-59C2E01309EC.png

当然,这种方法,一定要在提交审核的时候说明理由,要不然无法通过审核。

二、如果只有有自签证书,如何支持HTTPS?

关于使用自签证书的APP能不能通过审核,个人认为有很大风险无法通过审核,因为苹果要求支持ATSDE 证书必须是来着证书颁发机构颁发的证书或者是可信的根证书。官方解释如下:

0BF814CE-8CB4-4277-AEB5-4E2CEB36536E.png

恕我翻译水平不够精确,造成无法判断自签证书是否可信,不够网友倒是提供了使自签证书变为可信的方法,但是能不能通过审核还有待考核。但是这个方法经过测试,确实可以支持HTTPS协议。但是在请求中如何实现呢?笔者使用的请求库是AFNetworking3.x,因此先说明一下它的使用,其实AFNetworking从HTTP->HTTPS的转换也比较简单,在原来的基础上添加部分代码即可,系统的请求方法也是同样的原理,大家可以自己想或者Google。
因为AFNetworking3.x已经对证书验证有了最新的验证方法,所以你大可以不用过于操心,也可以查看其源代码原理,都在文件AFSecurityPolicy.m里,在这里我就不贴出源码各种装逼分析了。开发者在使用AFNetworking初始化AFHTTPSessionManager时,对其属性securityPolicy进行相应的设置即可:
AFHTTPSessionManager *networkManager= [[AFHTTPSessionManager manager] init]; …… // 2.设置校验证书模式 (使用自签证书,需要支持ATS,Allow Arbitrary Loads使用默认设置NO, 需要本地校验,否则请求失败) NSString *cerPath = [[NSBundle mainBundle] pathForResource:@"你导入本地的证书名称" ofType:@"cer"]; NSData *cerData = [NSData dataWithContentsOfFile:cerPath]; if (cerData) { AFSecurityPolicy *securityPolicy = [AFSecurityPolicy policyWithPinningMode:AFSSLPinningModeCertificate]; securityPolicy.allowInvalidCertificates = YES;// 客户端是否信任非法证书 securityPolicy.validatesDomainName = NO;// 是否在证书域字段中验证域名 securityPolicy.pinnedCertificates = [NSSet setWithObject:cerData]; networkManager.securityPolicy = securityPolicy; }
你在设置pinnedCertificates的时候是不是跟你百度到的很多关于这块的代码都不一样?那是因为很多都是AFNetworking2.x的版本,不知道为什么在网上那么流行。需要你注意的有以下几点:

1. 证书必须是xxx.cer格式,不会转格式的自行Google。并且要拖入项目的bundle里面,要不然读取不到。
2. 如果读取到证书数据在执行后面代码,要不然设置pinnedCertificates的时候会奔溃。
3. 发布APP的话,尽量不要设置securityPolicy.allowInvalidCertificates = YES;不要问为什么,这是允许无效证书,只是调试测试的时候使用,很可能无法通过审核。AFNetworking官方有注明:
5199159A-3A2E-4A17-B0EE-15F679DD4065.png

如果你的请求没用AFNetworking而是使用系统方法或者ASIHttpRequest之类的,请自行Google。

三、如果你有公信机构颁发的证书?

不管你的公司是从哪里买的或者是使用哪里的限时免费版,只要符合苹果官方的证书要求,具体要求依然参考:Apple-NSAppTransportSecurity。你都是幸运的,恭喜你,什么都不要设置,你只需要启用项目的ATS,然后使用AFNetworking的时候不要设置securityPolicy就行。这样你就可以尽情的访问你的HTTPS请求了,当然了,如果此时你还想添加其它只支持HTTP的请求,按前面Exception Domains的设置即可。

补充一点,如果你想验证你的项目的域名是否符合ATS标准,可以直接通过以下苹果官方给出的命令进行诊断(URL改成你的域名):
/usr/bin/nscurl --ats-diagnostics [--verbose] URL

好了,写的有点乱,不够详细,有些细节可能有误,但是绝对可以给你正确的方向,有什么问题还请多多讨论,欢迎留言。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,126评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,254评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,445评论 0 341
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,185评论 1 278
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,178评论 5 371
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,970评论 1 284
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,276评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,927评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,400评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,883评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,997评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,646评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,213评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,204评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,423评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,423评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,722评论 2 345

推荐阅读更多精彩内容