iOS适配ATS支持Https过AppStore审核

≯℡__Kan透↙ 提交于 2020-10-03 03:51:29

 

 
思维导图

说明:文章中部分内容参考了网络资源,如cocoaChina中的文章。

App Transport Security

iOS9中新增App Transport Security(简称ATS)特性, 主要使到原来请求的时候用到的HTTP,都转向TLS1.2协议进行传输。这也意味着所有的HTTP协议都强制使用了HTTPS协议进行传输。在 iOS 9 和 OS X 10.11 中,默认情况下非 HTTPS 的网络访问是被禁止的。当然,因为这样的推进影响面非常广,作为缓冲,我们可以在 Info.plist 中添加 NSAppTransportSecurity字典并且将 NSAllowsArbitraryLoads设置为 YES来禁用 ATS。

不过,WWDC 16 中,Apple 表示将继续在 iOS 10 和 macOS 10.12 里收紧对普通 HTTP 的访问限制。从 2017 年 1 月 1 日起,所有的新提交 app 默认ATS Configuration Basics / ATS 配置基础知识是不允许使用 NSAllowsArbitraryLoads来绕过 ATS 限制的,也就是说,我们最好保证 app 的所有网络请求都是 HTTPS 加密的,否则可能会在应用审核时遇到麻烦

最新的消息是苹果迫于压力,已经延迟了必须ATS的限制,不过这事情早晚要做的,还是尽快搞好

ATS 配置基础知识

对于使用 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)。

字典NSAppTransportSecurity的总体结构

NSAppTransportSecurity : Dictionary {     

NSAllowsArbitraryLoads : Boolean     

NSAllowsArbitraryLoadsInMedia : Boolean     

NSAllowsArbitraryLoadsInWebContent : Boolean     

NSAllowsLocalNetworking : Boolean     

NSExceptionDomains : Dictionary {

<domain-name-string>: Dictionary {

NSIncludesSubdomains : Boolean

NSExceptionAllowsInsecureHTTPLoads : Boolean

NSExceptionMinimumTLSVersion : String

NSExceptionRequiresForwardSecrecy : Boolean   // Default value is YES

NSRequiresCertificateTransparency : Boolean

}}}

所有键可以分为两类:主键,这些键用来定义 app 的总体 ATS 策略;子键,即NSExceptionDomains下面的键,使用这些键针对某个域名单独配置。

主键包括:

NSAllowsArbitraryLoads

设置为 YES,解除整个 app 的 ATS 限制;但是,通过-NSExceptionDomains进 行的配置依然有效。默认值为 NO。

注意:设置为 YES,会引发 App Stroe 的审查,开发者必须说明原因。

NSAllowsArbitraryLoadsInMedia

设置为 YES,解除通过 AV Foundation 框架访问媒体内容时的 ATS 限制;启用这个 键,务必确保载入的媒体内容已经被加密,例如受FairPlay保护的文件,或者是安全的 HLS流媒,其中不包含敏感的个人信息。默认为 NO。

NSAllowsArbitraryLoadsInWebContent

设置为 YES,解除通过 web view 发出的网络请求的 ATS 限制。启用这个键,可以使 app 访问任意网页内容,但不影响 app 的总体 ATS 策略。此键值默认为 NO。

NSAllowsLocalNetworking

设置为 YES,使得 app 可以载入任意本地资源,但不影响 app 的总体 ATS 策略。默 认为 NO。

NSExceptionDomains

为一个或多个域名单独配置 ATS。

被单独配置的域名,默认受到完全的 ATS 限制,不管NSAllowsArbitraryLoads的值 如何;需要通过子键,进一步配置

所有的子键都属于NSExceptionDomain。向Info.plist中添加这一主键:

创建字典,针对一个或多个域名,以便进行 ATS 配置。

这意味着之前使用主键所做的设置,对于这个域名来说,已经无效。

例如,及时之前设置NSAllowsArbitraryLoadsInMedia为 YES,然而NSExceptionDomain所代表的域名依然不能访问不安全的媒体内容。

基于这样的设定,可以针对域名进行 ATS 配置,增加或减少安全措施。例如:

将NSExceptionAllowsInsecureHTTPLoads设置为 YES,就 ;这样做会引发 App Store 的审查,详情见App Store Review for ATS。

通过配置NSExceptionRequiresForwardSecrecy为 NO,取消正向保密。

通过配置NSExceptionMinimumTLSVersion,更改 TLS 最低版本

NSExceptionDomains字典构成:

<域名字符串>代表想要配置的特定域名。可以添加多个域名(即添加多个这样的键),为它们统一配置 ATS 策略。这个键对应一个字典,包含以下子键:

NSIncludesSubdomains 设置为 YES,当前域名的 ATS 策略适用于其所有子域名。默认为 NO。

NSExceptionAllowsInsecureHTTPLoads 设置为 YES,可以同时通过 HTTP 和 HTTPS 访问当前域名。默认为 NO。注意,配置这个键值,将引发 App Store 的审查,开发者必须说明原因。

NSExceptionMinimumTLSVersion* 指定 TLS 的最低版本,因此可以使用版本较低,有安全漏洞的 TLS 协议。注意,配置这个键值,将引发 App Store 的审查,开发者必须说明原因。

NSExceptionRequiresForwardSecrecy* 设置为 NO,允许针对当前域名使用不支持正向保密的 TLS 加密算法。默认为 YES。

NSRequiresCertificateTransparency* 设置为 YES,将验证域名服务器证书的Certificate Transparency时间戳 。默认为 NO。

使用 ATS 的前提条件

在 ATS 完全开启的情况下,系统要求 app 的 HTTPS 连接必须满足以下要求:

X.509 数字证书必须满足下列标准中的一项:

由操作系统内嵌的根证书颁发机构签发

由通过操作系统管理员或用户主动安装的根证书颁发机构签发TLS 版本必须为1.2,任何不使用或使用较低版本 TLS / SSL 的连接,都将失败。

连接必须使用 AES-128 或 AES-256 对称加密算法。 TLS 算法套装必须以 ECDSA 密钥交换的形式支持正向保密,加密算法必须为下面之一:

TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384

TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256

TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384

TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA

TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256

TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA

TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384

TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256

TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384

TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256

TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA

服务端的叶证书签名密钥必须为下面之一:

至少2048位的 RSA 密钥

至少256位的 ECC 密钥

此外,服务器证书的哈希算法必须为 SHA-2,其摘要长度至少位256位(即 SHA-256 及以上)。上面的标准,未来可能会发生变化。但不会影响到 app 二进制包的兼容性。

App Store 对于 ATS 相关项的审核

某些对 ATS 的配置会引发 App Store 的审核,开发者必须说明原因。这些键有:

NSAllowsArbitraryLoads

NSExceptionAllowsInsecureHTTPLoads

NSExceptionMinimumTLSVersion

以下是一些原因说明例子,供参考:

必须连接由其他机构控制的服务器,其还不支持安全连接。

必须支持那些还未升级至可使用安全连接,不得不通过公共域名访问网络的设备。

必须通过 web 展示来源不一的各种网络内容,但又不能完全使用NSAllowsArbitraryLoadsInWebContent所管理的类。

向 App Store 提交审核时,开发者应主动提供足够的信息,以便解释 app 无法使用安全连接的原因

实现支持安全ATS策略

app内服务器网络请求访问支持https解决方案:

搭建https服务器,搭建https服务器需要ssl证书:

HTTPS服务器满足ATS默认的条件,而且SSL证书是通过权威的CA机构认证过的,那么我们在使用Xcode开发的时候,对网络的适配什么都不用做,我们也能正常与服务器通信。

第三方sdk接入与支持http访问:

主要是围绕info.pilst配置文件作相关的安全ATS策略

NSExceptionDomains 的设置方法如下, 比如我们要将 第三方 域名排除在 ATS 验证之外,就可以这样:

 
info.plist ATS设置

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!