美文网首页网络及安全iOS移动端开发工具
iOS app 支持HTTPS iOS开发者究竟需要做什么?

iOS app 支持HTTPS iOS开发者究竟需要做什么?

作者: Leesim | 来源:发表于2016-11-07 17:26 被阅读2808次

2016年12月21日更新开发者中心链接
https://developer.apple.com/news/?id=12212016b
该链接是苹果昨天刚在官网给的正式回复 如下:

App Transport Security (ATS), introduced in iOS 9 and OS X v10.11, improves user security and privacy by requiring apps to use secure network connections over HTTPS. At WWDC 2016 we announced that apps submitted to the App Store will be required to support ATS at the end of the year. To give you additional time to prepare, this deadline has been extended and we will provide another update when a new deadline is confirmed. Learn more about ATS.

这个东西是为了让大家放心 17年1月1日 不是苹果最终的deadline 推迟了,下面的步骤是iOS前端适配https 的全部步骤 按照步骤配置即可(不要再被网上传的强制https的文章洗脑了,都是ssl证书颁发机构的软文)

自从2016年的WWDC大会结束后,就出来个消息说,苹果方面在2017年1月1日要开始全面支持https了,也就是说原来绕过ATS的方法不行了。没有取巧的方式那就只能按照正规的流程来一遍了,这几天把这个坑搞明白了,其实整个过程前端并不需要做太多东西,但是我还是把整个流程熟悉了一遍,这样也算是苹果做的一个强制,为整个安全领域推进了一步。

刚开始我也是在网上找了一些教程,但是最后感觉网上的这些流程都或多或少有些问题,而且并不能告诉app前端开发他们到底需要做什么,毕竟大家都是刚开始走这个坑,对这个都不算太了解。所以我把做适配的这段时间走的坑总结一下。

对于HTTPS和HTTP的对比,本篇就不再作讲解,因为网上有大量的对比,简单的来说,HTTPS相对于HTTP更安全,更安全的原因就来自于多出来这个S----SSL证书

大致适配流程

(1)这里先说整个过程的大体流程,如果你们的公司有运维的同学在,那么先让运维的同学去看一下正规大厂用的是什么类型的SSL证书,额外说一下,现在很多网上有一些免费的证书,还有国内的一些厂商是比较便宜的证书,我不太建议去买这些,因为毕竟这次适配就是为了安全,不如一步到位。这里就不再介绍自签名一类的了,自签名并没有提升真正的安全度,算是模拟了签名的过程。
(2)证书申请成功后,需要后台的同学配置一下证书,将SSL证书绑定到后台服务上。
(3)前两步不需要前端的同学完成,前两步完成后,前端的同学才拿到对应的证书去做前端的适配。如果你们的项目本身就有网络请求管理类,那么只需要对管理类相关的代码进行修改就行了,如果没有,那就需要先封装一个网络请求管理类,然后替换之前的所有网络请求方法(这个过程是反人类的,真希望你用不到这个办法)

iOS app前端详细适配流程

先说一下单向认证和双向认证的区别:单向认证只要求站点部署了ssl证书就行,任何用户都可以去访问(IP被限制除外等),只是服务端提供了身份认证。而双向认证则是需要是服务端需要客户端提供身份认证,只能是服务端允许的客户能去访问,安全性相对于要高一些。

其实网上之前我查资料的时候已经发现了,大部分网上的认证都是双向认证,但是他们都错误的理解其为单向认证了。下面说一下app单向认证具体需要做什么。

单向验证

//在你封装的网络工具类请求前初始化时增加以下代码
AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
//设置证书模式,AFSSLPinningModeNone,代表前端包内不验证
//在单向认证时,前端不放证书,服务器去验证
AFSecurityPolicy *securityPolicy = [AFSecurityPolicy policyWithPinningMode:AFSSLPinningModeNone];
// 如果是需要服务端验证证书,需要设置为YES
securityPolicy.allowInvalidCertificates = YES;
//validatesDomainName 是否需要验证域名,默认为YES;
securityPolicy.validatesDomainName = NO;
//设置验证模式
manager.securityPolicy = securityPolicy;

双向验证

双向验证的过程我就不说了,因为网上基本全部是双向认证,需要把证书打包到应用的包里,这里贴一个比较详细的链接http://www.jianshu.com/p/f312a84a944c

这里只把最关键的代码跟单向认证做一个对比

//在你封装的网络工具类请求前初始化时增加以下代
AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
//设置验证证书,该模式下许愿把证书打包进项目里,进行验证
AFSecurityPolicy *securityPolicy = [AFSecurityPolicy policyWithPinningMode:AFSSLPinningModeCertificate];
//证书的路径
NSString *cerPath = [[NSBundle mainBundle] pathForResource:@"xxx" ofType:@".cer"];
NSData *dataSou = [NSData dataWithContentsOfFile:cerPath];
NSSet *set = [NSSet setWithObjects:dataSou, nil];
securityPolicy.allowInvalidCertificates = YES;
securityPolicy.validatesDomainName = YES;
[securityPolicy setPinnedCertificates:set];
//将验证方式赋值给管理者
manager.securityPolicy = securityPolicy;

两类验证方式的最大区别其实在于,是否需要把证书打包进入应用内。
跟着这个问题随之而来的就有另外的几个问题,对于app前端开发来说,究竟选择何种验证方式比较好呢。其实对于app来说,单向验证是最方便的,也是安全的,双向验证比单向来说更安全,但是对于app开发来说有几个问题需要面对。所以下面列一下单向和双向的优点和缺点,你可以选择最合适的方式来处理。

单向优点

1.更加灵活,客户端不需要把相应证书打包进入app内,这个SSL证书是有过期时间的,如果过期了,只需要服务器端修改证书即可,不会出现突然有一天莫名其妙app打不开了的问题。
2.虽然两种验证方法对于前端来说并没有太多工作了,但是相对来说单向对于服务端和前端来说更简单。

双向优点

1.更加安全。但是相对来说开发成本更高

对比之后,我们的app最终选择单向验证的方式。更多的是为了避免如果修改了证书的厂家这种意外事件的处理,避免不必要的麻烦。

总结

其实对于前端来说,并没有太多的工作量,重点是对于整个过程的理解和方式的选择。所以也不要害怕17年的全面https的问题。

下面是我自己个人的疑问,因为不确定明年的plist里面的ATS是不是在提交应用的时候Allow Arbitrary Loads是不是必须不要设置或者设置为NO,所以我在前几天向苹果开发者中心发了一个邮件,得到的结果真是出人意料

开发者中心邮件.png

这个回复真是哭笑不得,一边提倡https 一边说现在还没有对开发者做限制。不过管他呢,https是一个趋势,先做了,一步到位就行,明年的Allow Arbitrary Loads 照样上传应用的时候设置YES了,17年1月1日到底苹果是不是强制要求不让这么绕过,也不能确定。

这个坑过去了,但是ATS是对UIWebView和WKWebView有影响的,如果Allow Arbitrary Loads设置为NO, Allow Arbitrary Loads in Web Content不设置,那么UIWebView和WKWebView不能正常的显示,因为加载网页也是需要基于http和https协议的。所以需要将Allow Arbitrary Loads in Web Content设置为YES。

这块的问题都在摸索,如果有我与理解不到位的地方,希望能在评论中给我提意见,谢谢,互相学习。

相关文章

网友评论

  • azhunchen:如果是单向认证的话,抓包还是能看得到请求的内容
  • 须臾以北:楼主你好,Allow Arbitrary Loads in Web Content设置YES后, WKWebView可以加载https, UIWebView不行,为什么呢
    Leesim:我之前是以https://www.baidu.com 来测试的 具体如下 uiwebview基本处于淘汰的边缘 建议还是以wk为主 = =

    ATS 设置为YES

    webview 可以打开http 可以打开https

    wkwebview 可以打开http 可以打开https

    ATS 设置为NO

    webview 无法打开http 无法打开https

    wkwebview 可以打开http 可以打开https 但是都不显示图片
  • 懂妹儿:不错的,终于有个看的懂的了,谢谢楼主
  • 在没老之前:楼主,你好。我的Allow Arbitrary Loads设置为YES,然后域名是https,运行APP,一切正常。
    然后我想把Allow Arbitrary Loads设置为NO,域名同样是https,运行APP,也是一切正常,但是控制台会报警告。
    所以我想问,我的代码应该怎么改,info.plist里面怎么改
    我们的证书是买的CA证书
    Leesim:ats设置为no 然后按照我上面的代码修改一下网络请求类 就可以了 现在苹果还没有强制限制 可以暂时http
  • 我只是前端:你好作者,我想问下,Allow Arbitrary Loads设置为NO,服务端也设定成https,前端我也没做任何代码修改,而且也没有单向或者双向认证,但是我居然请求成功并返回结果了,请问是怎么回事!!! :flushed:
    Leesim:@我只是前端 我再去测测 总感觉这种情况不太正常= =不客气 哈哈 一起学习
    我只是前端:@我只是前端 不是,自己写的,不过现在服务端配置证书后请求都OK了,上线也没问题,谢谢楼主:stuck_out_tongue_winking_eye:
    Leesim:是接之前同事的代码么= =可能已经做了https的适配了
  • bjhbin:好
  • Laki只是想做一个程序猿:您好,想询问下,我换了域名HTTPS,但是比HTTP响应慢了1.5-2.5s,感觉太慢了。后台给我个域名,我替换了,并没有.cer文件作配置。想问下怎么回事?好慢
    Leesim:@Laki只是想做一个程序猿 确实https会比http相应慢 这个我现在还没办法解决 运维也都知道这个问题 https会比http慢 不需要.cer证书 你就按照上面的单向认证设置就可以了
  • c3646b5b1131:这个对已经上线的项目和企业级项目有影响吗?
    Leesim:@limei_1216 没有影响 仅可能影响1月1号后提交的 应用
  • MangoJ:Allow Arbitrary Loads 这个我设置成 NO 就无法访问服务器 是什么原因啊
    MangoJ:@死涵Leesim 我把设置证书那块代码注释掉依然可以请求数据,是不是就是证书设置失败了啊?
    Leesim:@MangoJ 服务器现在是https了么? afn设置类型按照上面的设置了吗? 如果设置了应该没有问题 什么都不做的话 ats设置no 则会请求失败
  • 昨夜雨轻栏:我给你打赏了你都不理我,猜猜我是谁。
    昨夜雨轻栏:@死涵Leesim 小明。。。。
    Leesim:@昨夜雨轻栏 :flushed: 木有注意啊 哈哈 你是?
  • 一个脱离了高级趣味的人e:你好,请问您那适配HTTPS 对sd_webImage 有没有影响,sd_webImage 需要像AFT那样验证证书吗?
    Leesim:@一个脱离了高级趣味的人e sd本身对https没有影响 只是请求的图片链接 如果为http开头的 会影响 如果真的如大家说的明年要全面https的话 公司的图片服务器也需要升级 比如类似七牛这样的图片存储云服务器 有提供https链接升级业务
  • 43a796d0f8d5:双向认证的话,如果以后换证书,之前的app版本,都不能用了吧。
    一个脱离了高级趣味的人e:@依诺1218 是的,要重新配置前端证书,
  • fc18f69e6ff0:我还是没有看明白 Allow Arbitrary Loads 到底是怎么处理 删除这个 还是设置为no
    Leesim:@闭上眼睛 免费的没有搞过 目前来看 用免费的有可能审核严格的话 不给过 这个东西本来就是为了安全 不如一步到位呀 这个钱公司给报销喽 相信老板能理解的
    fc18f69e6ff0:@死涵Leesim 我们后台用的是免费的ca证书 怎么配置呢 我按网上的操作怎么都链接不了 :sweat:
    Leesim:@闭上眼睛 目前苹果没有给回复 你把Allow Arbitrary Loads 设置为no 记得要把Allow Arbitrary Loads in Web Content设置为YES 不然webview 和wkwebview会受到影响 我是会先提交的时候 设置Allow Arbitrary Loads 设置为yes 如果不可以 我再改 因为苹果官方都没有强制 邮件里面也说了
  • a8ada2346225:请问webview加载的都是第三方的外连,那这些外连都是HTTP的,而且没有证书,要如何才能让webview的访问不受限制呢?
    Leesim:@Timothy00 要将Allow Arbitrary Loads in Web Content设置为YES。 跟ats设置的位置一样 算是一个小分类 让webview 加载http不受限制
  • 863c73f31933:你好作者,在2017年1月1日之后App中还含有HTTP链接的App还能不能用呢,还有会不会被强制下架?
    Leesim:@SunlightInMyLif 给苹果那边打电话确认说不会 而且https并不是强制的 所以应该没啥问题 网上看的关于强制https的文章大部分是ssl证书的颁发公司发的软文 :sweat: 具体的情况 我觉得还是以官方为准 有什么问题 应该会提前通知的

本文标题:iOS app 支持HTTPS iOS开发者究竟需要做什么?

本文链接:https://www.haomeiwen.com/subject/aeyouttx.html