NSAppTransportSecurity (对应的值为字典类型)被用来定义 app 在进行网络请求时的安全设定:为现有安全机制设定特例,或者开启新的安全特性。
在苹果的开发平台上,有一种被称为 App Transport Security(ATS) 的网络安全机制,适用于 app 以及 app extension,默认开启。这项机制确保 app 在进行网络访问时,使用业界标准的,没有已知重大安全隐患的协议和加密方式,以此确保用户的隐私和数据完整性。从而培养用户对您的 app 的信任。
通过在 info.plist 中配置这个键,开发者可以自定义网络安全策略。例如:
对 NSAppTransportSecurity 的支持自 iOS9.0,OS X v10.11 开始,适用于 app 和 app extension。
自 iOS10.0,macOS 10.12 开始,增加了对下列子键的支持:
对于使用 iOS9.0, OS X v10.11 SDK 及以上的 app 来说,ATS(App Transport Security)默认开启, NSAllowsArbitraryLoads 是字典 NSAppTransportSecurity 的根键,默认值 NO 。
在启用 ATS 的情况下,所有的 HTTP 请求必须为 HTTPS( RFC 2818 ) 连接。任何不安全的 HTTP 请求都将失败。ATS 使用 TLS(Transport Layer Security)v1.2( RFC 5246 )。更多关于安全连接的信息,请查阅 HTTPS Server Trust Evaluation 。
下面是字典 NSAppTransportSecurity 的总体结构,所有键都是非必填项:
可以看出,所有键可以分为两类:主键,这些键用来定义 app 的总体 ATS 策略;子键,即 NSExceptionDomains 下面的键,使用这些键针对某个域名单独配置。
主键包括:
阅读 表2 ,获取关于上述主键的详细信息。
所有的子键都属于 NSExceptionDomain 。向 Info.plist 中添加这一主键:
例如,及时之前设置 NSAllowsArbitraryLoadsInMedia 为 YES,然而 NSExceptionDomain 所代表的域名依然不能访问不安全的媒体内容。
基于这样的设定,可以针对域名进行 ATS 配置,增加或减少安全措施。例如:
还参考 Certificate Transparency ,保证访问特定域名时的安全,详情见 Certificate Transparency 。
NSExceptionDomains 字典构成:
阅读 表3 ,获取关于 NSExceptionDomains 的进一步详细信息。
NSURLSession 以及所有与其相关的 API 都实现了对 ATS 的支持;如果您的 app 基于 iOS9.0 SDK 或 OS X v10.11 SDK 以上版本开发,ATS 自动开启。(较老的 NSURLConnection 同样会在上述 SDK 中开启对 ATS 的支持。)然而,在使用底层网络 API 或第三方网络库时,无法受到 ATS 的保护。
iOS9.0 或 OS X v10.11 以下版本,不支持 ATS, NSAppTransportSecurity 会被操作系统忽略。当 ATS 不可用时,系统将根据 RFC 2818 提供标准的 HTTPS 安全策略,对服务端进行验证。
当您的 app 运行在 iOS9.0 或者 OS X v10.11以下时,网络连接仍然可用,但 ATS 不起作用。
ATS 只针对 公***域名 起效。ATS 对已下连接无效:
为了连接非法域名或本地域名,需要将 NSAllowsLocalNetworking 设置为 YES。
在 ATS 完全开启的情况下,系统要求 app 的 HTTPS 连接必须满足以下要求:
上面的标准,未来可能会发生变化。但不会影响到 app 二进制包的兼容性。
暂略
能否自行改写服务器授信校验规则,取决于 ATS 是否针对某个域名开启。解释如下:
某些对 ATS 的配置会引发 App Store 的审核,开发者必须说明原因。这些键有:
以下是一些原因说明例子,供参考:
向 App Store 提交审核时,开发者应主动提供足够的信息,以便解释 app 无法使用安全连接的原因。
表2列出了 NSAppTransportSecurity 字典所有主键信息,通过定义这些主键,开发者可以配置 app 的网络行为。同 NSExceptionDomains 相关的子键信息请查看表3。
表2 ATS 字典主键
表3列举了用来针对某个域名进行网络安全配置所使用的键。
表3 针对某个域名进行网络安全配置的子键
下面介绍 NSAppTransportSecurity 的常见配置:
不影响整体 ATS 策略,只针对特定服务器进行不安全的网络请求——例如,从图片服务器请求图片——可在 Info.plist 中做如下配置:
重要: 使用上述配置之前,请注意其可能带来的潜在威胁。例如,通过 HTTP 连接从服务器获取媒体资源,可能带来如下风险:
不影响整体 ATS 策略,只针对特定服务器降低 HTTPS 的安全等级——包括使用较老版本的 TLS / SSL 协议,不支持正向保密——可在 Info.plist 中做如下配置:
假设正在开发一款浏览器应用,需要能够让用户访问任意 URL。这种情况下,开发者应该针对受控服务器使用安全连接,例如用于发布 app 更新的服务器。
为了能够让针对受控服务器的访问享受 ATS 保护,同时保证其他不安全访问可用,可在 Info.plist 中做如下配置:
暂略
暂略