《App Transport Security Technote》翻译
《应用传输安全技术说明》
注意:这是一篇关于开发中用到的API或技术的初步文档。苹果提供该信息帮助您将本文所述的技术和编程接口用于苹果品牌产品之中。文中的信息可能发生变化,依据本文实现的软件应该在最终的操作系统软件上按照最终的文档进行测试。随着将来API和技术的发展该文档可能提供更新版本。
所谓应用传输安全(App Transport Security,以下简称ATS)是一项提高了应用和web服务之间连接安全的特性。该特性由一些默认的连接要求组成,遵守这些要求可以获得最佳的安全连接实践。应用可以重载这些默认行为并且关闭传输安全。
ATS在iOS 9及以后版本和OS X 10.11及以后版本可用。
默认行为
在为iOS 9.0及以后版本和OS X10.11及以后版本编译的应用中,所有使用NSURLConnection, CFURL, 或 NSURLSession的连接都使用ATS默认行为。不遵守这些要求的连接将会失败。关于各种连接方法的更多信息请参考《NSURLConnection Class Reference》,《CFURL Reference》, 和 《NSURLSession Class Reference》。
以下是ATS的要求:
· 服务器必须至少支持TLS协议的1.2版本。
· 连接密码仅限于提供正向加密的密码(参见下面的密码列表)。
· 证书必须使用SHA256或更好的签名哈希算法进行签名,使用2048位或更高的RSA密钥,或者256位或更高的Elliptic-Curve (ECC)密钥。无效的证书将导致失败并断开连接。
以下是可接受的密码:
• 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
例外情况
你可以在你的App或App扩展的Info.plist文件中指定默认行为的例外情况。使用属性列表的特殊键就可以指定例外或关闭ATS。表1-1展示了这些键和它们的类型,并使用缩进指明了其结构。
这些属性键的定义如下:
NSAppTransportSecurity
包含了用于重载默认ATS行为的所有设置的字典。应用Info.plist文件的顶级键。
NSAllowsArbitraryLoads
用于禁用ATS的布尔值,没有列在NSExceptionDomains字典中的所有域都会被禁用。列出的域则会使用对该域指定的设置。
默认值是NO,即所有的连接都需要默认的ATS行为。
NSExceptionDomains
指定域名的ATS例外字典。每一个键都是一个包含了例外域名的字符串。
<domain-name-for-exception-as-string>
已命名的域的例外的字典。键的名字就是域名——例如www.apple.com。
NSExceptionMinimumTLSVersion
指定连接所使用的TLS协议的最小版本的字符串。其值可以是TLSv1.0,TLSv1.1,TLSv1.2。默认值是TLSv1.2。
NSExceptionRequiresForwardSecrecy
标识该域是否只支持正向加密密码的布尔值。
默认值是YES。在默认行为中限制了密码的展示。
将值设置为NO则添加了下表中这些可接受的密码:
• TLS_RSA_WITH_AES_256_GCM_SHA384
• TLS_RSA_WITH_AES_128_GCM_SHA256
• TLS_RSA_WITH_AES_256_CBC_SHA256
• TLS_RSA_WITH_AES_256_CBC_SHA
• TLS_RSA_WITH_AES_128_CBC_SHA256
• TLS_RSA_WITH_AES_128_CBC_SHA
NSExceptionAllowsInsecureHTTPLoads
标识是否所有连接都使用HTTPS的布尔值。(译者注:此处不如按照键名称直接解释更好理解,就是是否允许不安全的HTTP加载。)使用这个键来访问没有证书的,或者有一个错误签名的域,自签名、签名过期或主机名称错误匹配都会被认为是错误签名。
默认值是NO。(译者注:表示不允许使用不安全的HTTP加载。)
NSIncludesSubdomains
标识顶级域下的所有子域是否都接受这些重载的布尔值。
默认值是NO。
NSThirdPartyExceptionMinimumTLSVersion
NSExceptionMinimumTLSVersion键的另一个版本,当域是一个不受开发者控制的应用服务时使用这个键。
NSThirdPartyExceptionRequiresForwardSecrecy
NSExceptionRequiresForwardSecrecy键的另一个版本,当域是一个不受开发者控制的应用服务时使用这个键。
NSThirdPartyExceptionAllowsInsecureHTTPLoads
NSExceptionAllowsInsecureHTTPLoads键的另一个版本,当域是一个不受开发者控制的应用服务时使用这个键。
--------------------------
官方文献英文原文请移步:https://developer.apple.com/library/prerelease/ios/technotes/App-Transport-Security-Technote/index.html#//apple_ref/doc/uid/TP40016240