iOS9 - ATS

转载自:

iOS 9学习系列:如何使用ATS提高应用的安全性

苹果新『应用通信安全』的理解和使用


在2015的WWDC大会上,Apple明确表示了它打算以身作则的通过一个新特性来提高操作系统的安全性,它就是App Transport Security.Apple期望开发者们在他们的应用中使用App Transport Security.

什么是App Transport Security?

简短的说就是ATS,是iOS9和OS X El Capitan的一个新特性。(尽管Apple没有提到watchOS,我们可以推测 App Transport Security 也同样适用于watchOS 2。)App Transport Security 的目标是提高Apple 操作系统的安全性以及在此操作系统上运行的任何应用的安全性。

基于HTTP传输数据的网络请求都是明文。App Transport Security 通过强力推行一系列的最好的安全实际操作来积极地促进安全性,最重要的一个就是要求网络请求必须在一个安全的链接上传输。开启App Transport Security后,网络传输自动通过HTTPS传输而不是HTTP.

还有一系列其他的要求来进一步提高安全性能。例如,App Transport Security要求TLS (Transport Layer Security) 1.2或者更高。可能你并不是很了解 TLS,但我保证你肯定听过SSL (Secure Sockets Layer)。TLS是SSL的继承人,它是一系列加密协议的集合用来加强在网络连接上的安全性。

如何设置ATS?

在iOS 9 和 OS X EI Caption之后,当使用NSURLSession的时候默认会开启ATS。然而不幸的是,对于大多数开发者而言,这将意味着在他们基于新版本的操作系统做开发时,情况有了很大的变化。好消息是,苹果官方提供了一些可选配置项来决定是否开启ATS模式,也就是可以选择开启或者不开启。

开发者可以针对某些确定的URL不使用ATS,这需要在工程中的info.plist中标记NSExceptionDomains。在NSExceptionDomains字典中,可以显式的指定一些不使用ATS的URL。这些你可以使用的例子可以是:

  • NSIncludesSubdomains

  • NSExceptionAllowInsecureHTTPLoads

  • NSExceptionRequiresForwardSecrecy

  • NSExceptionMinimumTLSVersion

  • NSThirdPartyExceptionAllowsInsecureHTTPLoads

  • NSThirdPartyExceptionMinimumTLSVersion

  • NSThirdPartyExceptionRequiresForwardSecrecy

subdomain 子域 exception [ɪk'sepʃ(ə)n; ek-] 例外 insecure [,ɪnsɪ'kjʊə; ,ɪnsɪ'kjɔː] 不安全的 secrecy ['siːkrɪsɪ] 保密

这些关键字使我们可以更加细致的设置针对不使用ATS的域名情况下禁用ATS或者一些特殊的ATS选项。

info.plist

如何使用ATS?

关于App Transport Security,每个应用都属于4个大类当中的一类。我们来看看每一个大类都是怎样影响应用的。

例1 所有情况都使用ATS

如果你的应用只基于支持HTTPS的服务器,那么你太幸运了。你的应用不需要做任何改变。但是,注意App Transport Security要求TLS 1.2而且它要求站点使用支持forward secrecy协议的密码。证书也要求是符合ATS规格的。因此慎重检查与你的应用交互的服务器是不是符合ATS的要求非常重要。

例2 特殊情况除外,都使用ATS

如果你希望自己所有的域名,除了一些已知并不会使用ATS之外的,所有通信都使用ATS。这种情况下你可以指定一些不使用ATS的特殊情况,而其余的情况使用ATS。

对于这种场景,可以使用 NSExceptionDomains 来标识使用ATS默认设置的域。为了筛选出所有域或者子域,可以创建一个包含想要排除使用ATS的URL的字典,然后设置其中的 NSExceptionAllowInsecureHTTPLoads 的值为true。

例2

例3 除特殊情况外,都不使用ATS

一种与上例相反的情况,你可能进希望在你明确知道支持的域内使用ATS。这种情况下,需要设置 NSAllowArbitraryLoads 为true,然后在 NSExceptionDomains 字典中定义需要保证安全性的URL。需要保证安全性的每个域都需要有自己的字典,而且字典中的 NSExceptionAllowInsecureHTTPLoads 选项需要设置为false*NSExceptionAllowsInsecureHTTPLoads* 设置为YES
arbitrary ['ɑːbɪt(rə)rɪ] 任意的

例3

这里写图片描述

例4 低级的ATS

在某些情况下,可能ATS用于所有情况,或者一些,或者是自有的URL,但是并未针对所有的ATS最佳实践全部支持。也许你的应用服务器仅支持TLS1.2,但是不支持之后的版本,与其把涉及到的所有域都设置为不用ATS,不如设置为支持版本较低的ATS。这种场景下,需要创建一个NSExceptionDomains字典,这是一个对于每个域都要重用的字典选项,然后设置NSExceptionRequiresForwardSecrecy值为false。类似的,如果你希望向前支持,但是需要最低版本的TLS,你可以通过NSExceptionMinimumTLSVersion关键字定义你的应用服务器所支持的TLS版本。
例4

例5 NSA-friendly模式

如果想完全不使用ATS(不建议使用这种模式,并且需要你完全理解其隐藏的危险。)你可以在info.plist中设置NSAllowArbitraryLoads属性为true。

例5

带"ThirdParty"字样的关键字:
在功能上,这些关键字与不含有"ThirdParty"的关键字有同样的效果。
而且实际运行中所调用的代码将会完全忽略是否使用"ThirdParty"关键
字。你应该使用适用于你的场景的关键字而不必过多考虑这些。


虽然ATS大多数安全特性都是默认可用的,Certificate Transparency是必须设置的。
如果你有支持Certificate Transparency的证书,你可以查
NSRequiresCertificateTransparency关键字来使用Certificate Transparency。
再次强调,如果你的证书不支持Certificate Transparency,此项需要设置为不可用。

如果需要调试一些由于采用了ATS而产生的问题,需要设置
CFNETWORK_DIAGNOSTICS为1,这样就会打印出包含被访问的URL和ATS错
误在内的NSURLSession错误信息。要确保处理了遇到的所有的错误消息,这
样才能使ATS易于提高可靠性和扩展性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值