如何使用ATS提高应用的安全性(转载)
本文由CocoaChina译者YueWang翻译自tutsplus
原文:Apple Tightens Security With App Transport Security
在过去几年中,对web安全的注意和它的重要性都在充分的稳定增长。在今年的WWDC大会上,Apple明确表示了它打算以身作则的通过一个新特性来提高操作系统的安全性,它就是App Transport Security.
当然,一个平台的安全性跟它的各个组件以及包括的第三方应用的安全性能息息相关。换句话说,Apple期望开发者们在他们的应用中使用App Transport Security.
在这篇文章中,我会解释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传输数据的网络请求都是明文。不言而喻的这会引起相当大的安全风险。Apple强调每个开发者都应该致力于保证客户的数据都是安全的,尽管那些数据可能看起来并不是很重要或者很敏感。
App Transport Security 通过强力推行一系列的最好的安全实际操作来积极地促进安全性,最重要的一个就是要求网络请求必须在一个安全的链接上传输。开启App Transport Security后,网络传输自动通过HTTPS传输而不是HTTP.
还有一系列其他的要求来进一步提高安全性能。例如,App Transport Security要求TLS (Transport Layer Security) 1.2或者更高。可能你并不是很了解 TLS,但我保证你肯定听过SSL (Secure Sockets Layer)。TLS是SSL的继承人,它是一系列加密协议的集合用来加强在网络连接上的安全性。
Apple最近发表了一篇公开的,先导篇的文章technote about App Transport Security,给了开发者们一个机会去研究 App Transport Security。这篇文章列出了 App Transport Security 期望从你的应用和与应用交互的网络服务中得到的东西。
例外
等一下。我的应用使用的是我没有权限控制的CDN (Content Delivery Network)而且它不支持HTTPS。别担心,Apple都替你考虑好了。关于App Transport Security,每个应用都属于4个大类当中的一类。我们来看看每一个大类都是怎样影响应用的。
只有HTTPS
如果你的应用只基于支持HTTPS的服务器,那么你太幸运了。你的应用不需要做任何改变。但是,注意App Transport Security要求TLS 1.2而且它要求站点使用支持forward secrecy协议的密码。证书也要求是符合ATS规格的。因此慎重检查与你的应用交互的服务器是不是符合ATS的要求非常重要。
混合
你的应用与一个不符合ATS要求的服务器工作是很有可能的。在这种情况下,你需要告诉操作系统哪些站点是涉及到的然后在你的应用的 Info.plist文件中指明哪些要求没有达到。
这意味着对于每个与你应用交互的站点, 除了在你的应用的 Info.plist中声明的那些以外不强制要求App Transport Security,其它的都需要。你可以使用很多的预定义的keys值来配置例外(exceptions)。在下面的 Info.plist文件中,我们定义了3个例外。
api.insecuredomain.com
我们定义的第一个例外告诉ATS当与这个子域交互的时候撤销了必须使用HTTPS的要求。注意这个仅仅针对在例外中声明了的子域。非常重要的一点是要理解NSExceptionAllowsInsecureHTTPLoads关键字并不仅仅只是与使用HTTPS相关。这个例外指明了对于那个域名,所有的App Transport Security的要求都被撤销了。
cdn.domain.com
很可能你的应用是与一个支持HTTPS传输数据的服务器交互,但是并没有使用TLS 1.2或更高。在这种情况下,你定义一个例外,它指明应该使用的最小的TLS的版本。这比完全撤销那个域名的App Transport Security要更好更安全。
thatotherdomain.com
NSIncludesSubdomains关键字告诉 App Transport Security这个例外适用于这个特定域名的所有子域。这个例外还进一步通过扩展可接受的密码列表来定义这个域名可以使用不支持forward secrecy(NSExceptionRequiresForwardSecrecy) ?协议的密码。想了解更多关于forward secrecy的信息,我推荐你去看这个文章Apple's technote。
撤销
如果你在创建一个网页浏览器,那么你有一个更大的麻烦。因为你不可能知道你的用户将要访问那个网页,你不可能指明这些网页是否支持ATS要求且在HTTPS上传输。在这种情况下,除了全部撤销 App Transport Security 没有其它办法。
非常重要的是你要明确的指明撤销 App Transport Security。牢记App Transport Security是默认强制执行的。在你的应用的Info.plist, 文件中,为NSAppTransportSecurity关键值添加一个字典。这个字典应该包括一个关键字,NSAllowsArbitraryLoads,以及它的值要被设置为YES。如果你撤消了App Transport Security,下面内容就是你的应用的 Info.plist 文件应该看起来像的东西:
有着例外的撤销
第四个大类是当你的应用撤消了App Transport Security,,但同时定义了一些例外。这非常有用就是当你的应用从很多的服务器上取数据,但是也要与一个你可控的API交互。在这种情况下,在应用的Info.plist文件中指定任何加载都是被允许的,但是你也指定了一个或多个例外来表明哪些是必须要求 App Transport Security的。下面是Info.plist文件应该会有的内容:
时间
Apple强调如果应用是建于iOS9 或者 OS X El Capitan,那么它们自动的加入 App Transport Security 。这意味着只要你的应用建于 iOS 8或OS X Yosemite上,你不需要对你的应用做任何改变。
基于以前发布的iOS和OSX X系统的经验,我们了解到Apple在发布了官方版本后不久就要求开发者们使用最新的SDK来创建应用。换句话说,即便你不想在今年末当iOS 9 和OS X El Capitan 发布的时候遵守App Transport Security ,很有可能苹果会在2016年的第一或第二季度要求开发者们基于最新的SDK来开发应用。因此我推荐你尽早研究App Transport Security 将会对你的应用带来的影响。
总结
我希望这篇文章清楚地讲明了App Transport Security并不是那些哪天采用都无所谓的技术。它跟之前Apple要求所有应用都支持64位一样,迟早要全部采用。除非你的应用只跟基于HTTPS传输协议遵循ATS要求的服务器交互,你需要花些时间研究清楚App Transport Security将会怎样影响到你的应用。Apple的这篇文章technote about App Transport Security可以帮助到你。
推荐阅读:苹果新『应用通信安全』的理解和使用