最近一直做项目的ATS改造,期间遇到了种种问题,各种坑都记录下来,

比如iOS版本、afnetwork版本、证书(是否为自签证书)、域名验证、TLS版本等等,我们项目更复杂,还使用了域名到IP映射的路由表策略,在验证自签证书的时候各种配置host,这种需求在文章里就不赘述了,有相似需求的可以私下讨论:

有描述不对的地方,欢迎大神指正!

先鬼扯点儿小背景,不喜请略过黄色部分:)

关于ATS,简单说就是app使用的网络请求都必须走https,iOS9以后,此设置默认开启,项目中所有的http请求直接被系统block了,

当然会有一些例外,可以在info.plist配置第三方域名时使用,如下:

  • NSAllowsArbitraryLoads  设置app禁用ATS,将在2017年1月1日后要求不能禁用

  • NSAllowsArbitraryLoadsInMedia  可以使用AVFoundation播放音视频不使用https

  • NSAllowsArbitraryLoadsInWebContent 可以在内置浏览器(WKWebView、UIWebView)中使用普通http请求

  • NSExceptionAllowsInsecureHTTPLoads 可以设置域名使用http请求或者没有证书、使用自签证书、证书过期、证书不匹配等等不安全请求

  • NSExceptionMinimumTLSVersion      可以设置一些https服务协商的TLS版本低于1.2

具体的配置可以参考官方文档:

https://developer.apple.com/library/content/documentation/General/Reference/InfoPlistKeyReference/Articles/CocoaKeys.html#//apple_ref/doc/uid/TP40009251-SW58

按照苹果官方的说法,对证书、域名、IP都有严格的要求,这些在配置服务器证书时都要注意

比如证书:

The X.509 digital server certificate must meet at least one of the following trust requirements:

  • Issued by a certificate authority (CA) whose root certificate is incorporated into the operating system

  • Issued by a trusted root CA and installed by the user or a system administrator

即要求证书要么是正规CA颁发机构颁发的,根证书集成在系统中;要么是被用户手动安装到系统中。而且证书必须得是至少使用SHA-256加密算法

其次,TLS version must be TLS 1.2

加密方式也有要求:AES-128 or AES-256 等等等等

关于ATS的限制范围,苹果是这么说的:

ATS 只适用于host name,对下列情况不会限制:

  • IP地址(关于这一点,苹果系统在iOS9和10表现不一致,启用ATS后,在iOS10上,使用IP地址是不被限制的,但是在iOS9上会被block)

  • 非法host names(有谁知道什么是非法的么?)

  • 本地服务,如local域名

如果使用上述说的非法host name 或者本地服务,请设置NSAllowsLocalNetworking key to YES.

进入正题,客户端 AFNetwork适配:

关于网络层,大部分app都是用了AFNetwork作为依赖库实现,这里就从AFNetwork开始:

其实改造https的时候可以先不用启用ATS,改造完以后再启用就行。

AFNetwork针对https封装了证书、域名验证的逻辑,主要集中在AFSecurityPolicy,先从最简单的说,

正规CA证书:

如果使用的CA证书是从正规机构购买,那么配置就比较简单:

使用以上设置,就完成了https 功能的支持。

关于配置项,AFSecurityPolicy使用默认的安全策略,不允许非法证书(一般是自签证书),强制要求验证域名,

当然这些设置也是默认设置,直接省略后两行代码也可。

自签证书:

如果使用自签证书,就需要走第二套方案:(让用户把证书安装到手机这招就算了,可行性几乎为0,除非你的app跟12306一样牛逼)

首先需要把证书cer文件导入到app中,剩下的工作,AFNetwork会帮你搞定,它会自动扫描bundle中的cer文件,并制作证书信任锚点,

比CA证书多一步导入文件,即可

下面简单聊聊AFNetwork 的验证机制吧

关于这一点,我在看AFNetwork源码时有个疑问,它在扫描bundle时用的[NSBundle bundleForClass:[self class]],

而不是用的[NSBundle mainBundle],我在测试过程中遇到过一次前者返回的bundle为AFNetwork的bundle,所以读取不到cer文件,这样的话引入到工程中的cer文件肯定扫描不到吧。。。,有很多导入cer文件时手动读取的方式:如下:

 //创建证书data
NSData*certData =[NSData dataWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"HTTPS" ofType:@"cer"]];
SecCertificateRef rootcert = SecCertificateCreateWithData(kCFAllocatorDefault,CFBridgingRetain(certData));
const void *array[1] = { rootcert };
certs = CFArrayCreate(NULL, array, 1, &kCFTypeArrayCallBacks);

 anyway,无论是AFNetwork自动扫描还是手动导入,最终目的都是验证证书

AFNetwork其实也是使用系统验证证书链的方式,首先将服务器返回的证书信息添加到验证策略:

然后使用系统方式验证证书链:

以上就通过了证书验证,接下来还有进行域名验证,

以上主要是将app中的证书和域名进行验证

AFNetwork ATS 网络层改造的更多相关文章

  1. IOS项目之分层MVVM

    在做.Net时,有用到三层架构,使项目分层.ios项目使用AFNetWork把网络层这块也放进了ViewController中,数据解析缓存这些也在里面,这样层次结构可能不够清楚,今天就试着分离了一下 ...

  2. 如约而至:微信自用的移动端IM网络层跨平台组件库Mars已正式开源

    1.前言 关于微信内部正在使用的网络层封装库Mars开源的消息,1个多月前就已满天飞(参见<微信Mars:微信内部正在使用的网络层封装库,即将开源>),不过微信团队没有失约,微信Mars ...

  3. 如何排查APP服务端和客户端是否支持ATS

    服务端排查 取得客户端直接连接的服务端域名及端口,例如mob.com.cn,端口443,即HTTPS默认端口.针对公网可访问的生产环境地址,建议使用的在线监测工具.https://wosign.ssl ...

  4. iOS应用架构谈(三):网络层设计方案(上)

    iOS客户端应用架构看似简单,但实际上要考虑的事情不少.本文作者将以系列文章的形式来讨论iOS应用架构中的种种问题,本文是其中的第三篇,主要讲网络层设计以及安全机制和优化方案. 前言 网络层在一个Ap ...

  5. iOS应用架构谈 网络层设计方案

    网络层在一个App中也是一个不可缺少的部分,工程师们在网络层能够发挥的空间也比较大.另外,苹果对网络请求部分已经做了很好的封装,业界的AFNetworking也被广泛使用.其它的ASIHttpRequ ...

  6. [转] iOS应用架构谈 网络层设计方案

    原文地址:http://casatwy.com/iosying-yong-jia-gou-tan-wang-luo-ceng-she-ji-fang-an.html iOS应用架构谈 开篇 iOS应用 ...

  7. iOS网络层设计感想

    App的开发无外乎从网络端获取数据显示在屏幕上,数据做些缓存或者持久化,所以网络层极为重要.原来只是把AFNetwork二次封装了一下,使得调用变得很简单,并没有深层次的考虑一些问题. 前言 参考: ...

  8. ATS来了,网页HTTP访问怎么办?

    推荐理由 ATS(App Transport Security),是苹果在WWDC 15提出的,苹果将收紧http的访问,这样会造成我们周边的许多站点和应用均不能正常访问,这里就对ATS进行了简单分析 ...

  9. 【转】如约而至:微信自用的移动端IM网络层跨平台组件库Mars已正式开源

    网上看到关于微信官方的跨平台跨业务的终端基础组件Mars的介绍文章,转载这这里.源代码: https://github.com/Tencent/mars作者:男人链接:https://zhuanlan ...

随机推荐

  1. AC自动机及trie图 pascal

    ; type data=record sum,failed:longint; son:array ['a'..'z'] of longint; end; ..maxn] of data; que:.. ...

  2. 【转】Unity3d + NGUI 的多分辨率适配

    原文地址:http://www.cnblogs.com/cqgreen/p/3348154.html   一.当下移动设备的主流分辨率(数据来自“腾讯分析移动设备屏幕分辨率分析报告”) 1.1 iOS ...

  3. WeView 里引用的H5中的文字 到行末尾 文字被切割

    这个情况 在iPhone6以上没问题  以下有问题  具体情况是 我用以下代码计算内容的高度 NSString *injectionJSString = @"var script = doc ...

  4. HDU 4771

    http://acm.hdu.edu.cn/showproblem.php?pid=4771 给一个地图,@是起点,给一些物品坐标,问取完所有物品的最小步数,不能取完输出-1 物品数最多只有四个,状态 ...

  5. Cocos2dx对精灵的优化

    cocos2dx针对游戏设计的不同方面会有不同的优化方案,可以对声音,对内存,对图片格式,对色彩等等进行优化.有关这些方面的方法请大家查找其他的文章.我今天要说的是如何对精灵进行优化,程序中我们用到的 ...

  6. android view:布局优化

    今天在图书馆看了一个android性能优化. 关于布局优化有几个小技巧: 1.尽量减少布局的嵌套,而使用相对布局,这样的话会减少布局对象的创建,并且可以再事件传递的时候减少传递嵌套. 2.使用incl ...

  7. Android模拟器Genymotion如何访问本地服务器?

    Genymotion能否访问到本地服务器,其实与Genymotion本身并无太大关系.Genymotion作为VirtualBox中的一个虚拟OS运行,所以它访问网络的方式与其他VirtualBox中 ...

  8. android 中theme和style的语法相关

    1.theme和style都是一组属性的集合,用于定义文本.颜色.大小等显示风格.他们都是资源,可以用android系统级别的一些默认的风格和主题资源,你也可以自定义你自己的主题和风格资源. 2.自定 ...

  9. JavaScript DOM 编程艺术·setInterval与setTimeout的动画实现解析

    先贴上moveElement()函数的大纲,为了方便观看,删了部分代码,完整版粘到文章后面. function moveElement(elementID,final_x,final_y,interv ...

  10. win 7~~~win 10 debug的使用方法

    第一步:下载安装DOSBox软件 附上链接:http://pan.baidu.com/share/link?uk=553724690&shareid=3310971559&third= ...