app transport security(ats) 是apple为增强ios app网络通信安全提出的安全功能,适用于ios app和app extension;在启用ats之后,它会强制应用通过https(而不是http)连接网络服务。
【注意】这仅是app store审核策略的变更,而不是技术上的限制,即app通过ats相应配置仍可以通过http进行网络访问(测试时可使用)。
<code>nsallowsarbitraryloads</code>,默认值为<code>no</code>,置为yes后,所有网络请求不受ats的限制;
<code>nsallowsarbitraryloadsformedia</code>,默认值为<code>no</code>,置为yes后,使用<code>av foundation</code>框架载入资源时不受ats的限制;(ios 10.0及以上支持,测试发现真机可行,模拟器未起作用)
<code>nsallowsarbitraryloadsinwebcontent</code>,默认值为<code>no</code>,置为yes后,使用web view的网络请求不受ats限制;(ios 10.0及以上支持)
<code>nsallowslocalnetworking</code>,默认值为<code>no</code>,置为yes后,本地网络请求不受ats限制;(ios 10.0及以上支持)
<code>nsexceptiondomains</code>,配置特定域名的ats访问属性;
<code>nsincludessubdomains</code>,默认值为<code>no</code>,置为yes后,该域名的ats配置适用于其子域名;
<code>nsexceptionallowsinsecurehttploads</code>,默认值为<code>no</code>,置为yes后,该域名可通过http请求访问但tls版本要求不会改变;
<code>nsexceptionminimumtlsversion</code>,默认值为<code>tlsv1.2</code>,设置该域名支持的tls最低版本,有效值:<code>tlsv1.0</code>、<code>tlsv1.1</code>和<code>tlsv1.2</code>;
<code>nsexceptionrequiresforwardsecrecy</code>,默认值为<code>yes</code>,置为no后,访问该域名时tls ciphers可以不支持完全正向保密(pfs);
<code>nsrequirescertificatetransparency</code>,默认值为<code>no</code>,置为yes后,访问该域名时服务器证书需要有效的sct(signed certificate timestamps)。
【注意】<code>nsallowsarbitraryloads</code>、<code>nsallowsarbitraryloadsformedia</code>、<code>nsallowsarbitraryloadsinwebcontent</code>和<code>nsexceptionallowsinsecurehttploads</code>任一属性置为<code>yes</code>或设置<code>nsexceptionminimumtlsversion</code>,都会触发app store的额外审核并需要提交对应说明(详情见2.3节)。
nsurlconnection/nsurlsession相关及任何基于此的上层api;
经测试,基于ip访问的http请求(使用nsurlconnection/nsurlsession),在ios 9系统上受ats限制;但在ios 10系统上不受ats限制,可以正常访问。
ios 9.0+系统支持,低于ios 9.0系统忽略<code>nsapptransportsecurity</code>的配置。
使用apple底层网络api或第三方网络库api,不受ats限制。
当ats要求全部使能时,https网络连接需要满足下面要求:
x.509证书必须至少满足下面一种条件:
由根证书是操作系统安装的ca颁发;
由用户或系统管理员信任并安装的根证书颁发;
连接必须使用aes-128或aes-256对称加密算法,tls协商算法必须通过ecdhe密钥交换保证完全正向保密(perfect forward secrecy, pfs),ecdhe密钥必须属于下面一种:
服务器叶证书必须使用下列的密钥签名:
至少2048位的rsa密钥;
至少256位的ecc密钥;
https访问指定域名开启certificate transparency后,参照1.1节描述,<code>nsrequirescertificatetransparency</code>需要置为<code>yes</code>。
目前apple官方没有系统、完整地说明ats的审核标准,部分已经明确的审核要求参考下面描述。
上传到app store要审核的app,若需要放宽ats的安全限制,配置有以下列出的<code>ats</code>相关属性,便会<code>触发额外审核</code>,并要求<code>提交声明</code>,说明配置的原因,具体含义可参考1.1节描述;
ats的提出,是为了在系统层面保障ios app网络通信的安全;apple只所以加强对ats配置的审核,是为了防止开发者们遇到ats相关的场景时,只是简单地将ats完全关闭(只要没有强制性措施,开发者会这么做);在此基础上,app审核同样会遵循原则:app review will require "reasonable justification" for most ats exceptions.
apple官方给出的可以通过审核的声明demo如下:
必须使用第三方提供的服务,但是其没有支持https;
必须通过域名连接到设备,但该设备不能支持安全连接;
必须展示不同来源的网页内容,但是不能基于<code>nsallowsarbitraryloadsinwebcontent</code>支持的类(uiwebview / wkwebview)实现;
载入加密的媒体资源并且其中不涉及个人信息。
由于apple官方并没有给出ats审核的完整说明,ats审核时什么才是合适合理的声明也没有明确的客观定义,以上demo描述仅能作为参照;为保险起见,建议尽快按照apple要求进行https适配。
使用apple上层网络api(nsurlconnection/nsurlsession)的http访问,
基于域名访问的请求,需要按照按照2.1节描述进行https适配;
基于ip访问的请求,在ios 10系统可以不受ats限制正常访问,建议同样进行https适配。
使用apple底层网络api进行的网络请求无需进行https适配。
尽可能地按照要求完成https的适配,若应用场景必须进行<code>ats exceptions</code>的配置(比如,浏览器应用必须同时支持http/https载入、强依赖的第三方服务没有支持https访问等),保证ats exceptions配置最小化,app审核时按照2.3节描述给出合理的解释声明。
https适配完成后,可以先使用<code>/usr/bin/nscurl</code>(os x v10.11及以上系统支持)工具模拟进行ats网络连接状况诊断,命令如下:
连接指定url时,
<code>--ats-diagnostics</code>参数的设定,会模拟ats属性的不同配置场景(nsallowsarbitraryloads、nsexceptionminimumtlsversion、nsexceptionrequiresforwardsecrecy和nsexceptionallowsinsecurehttploads的不同组合)进行连接;
<code>--verbose</code>指定时,可显示ats不同配置场景的详细信息。
例,检测阿里云官网<code>www.aliyun.com</code>
<a href="https://developer.apple.com/library/prerelease/content/documentation/general/reference/infoplistkeyreference/articles/cocoakeys.html#//apple_ref/doc/uid/tp40009251-sw59">apple-nsapptransportsecurity</a>
<a href="https://developer.apple.com/videos/play/wwdc2016/706/">wwdc-what's new in security</a>
<a href="http://devstreaming.apple.com/videos/wwdc/2016/706sgjvzkvg6rrg9icw/706/706_whats_new_in_security.pdf">wwdc-what's new in security-pdf</a>
<a href="https://forums.developer.apple.com/thread/14816">app transport security tip</a>
<a href="https://developer.apple.com/library/content/technotes/tn2232/_index.html">https server trust evaluation</a>
<a href="https://forums.developer.apple.com/thread/48979">apple forum -1</a>
<a href="https://forums.developer.apple.com/thread/51508">apple forum -2</a>
<a href="https://forums.developer.apple.com/message/15705#15705">apple forum -3</a>
ats审核策略还未正式公布,存在变动的可能,上述分析仅供参考。