iOS9 - NSAppTransportSecurity
原文地址:http://www.pluto-y.com/ios9-nsapptransportsecurity/
App Transport Security(以下均称ATS
)是iOS9提供的一个新特性,主要是保证app和web服务之间的安全。如果不想开启的话,可以关闭这个特性。
所有用到NSURLConnection
、CFURL
以及NSURLSession
API都会触发ATS
(使用iOS9的SDK编译)验证, 所以在iOS9中需要符合一些配置才可以使ATS
正常运行。
配置要求
关于App Transport Security 的一些进本配置要求:
* 服务器只要支持TLS协议1.2
* 加密算法也是有限制,需要在以下列表中
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
- 必须是用至少是HA256的算法,用至少是2048位的RSA的key 或至少是256位的Elliptic-Curve(ECC)的key所产生的证书
属性结构
如果你的服务器不是HTTPS的协议,想要添加例外可以在程序中的info.plist
文字间 添加例外。甚至是你不想开启ATS
的话,都可以在配置文件中进行配置。关于配置项可以参考下表:
Key | Type | 备注 |
---|---|---|
NSAppTransportSecurity | Dictionary | 根属性 |
NSAllowsArbitraryLoads | Boolean | 一级属性 |
NSExceptionDomains | Dictionary | 一级属性 |
< domain-name-for-exception-as-string > | Dictionary | 二级属性 |
NSExceptionMinimumTLSVerion | String | 三级属性 |
NSExceptionRequiresForwardSecrecy | Boolean | 三级属性 |
NSExceptionAllowsInsecureHTTPLoads | Boolean | 三级属性 |
NSIncludesSubdomains | Boolean | 三级属性 |
NSThirdPartyExceptionMinimumTLSVersion | String | 三级属性 |
NSThirdPartyExceptionRequiresForwardSecrecy | Boolean | 三级属性 |
NSThirdPartyExceptionAllowsInsecureHTTPLoads | Boolean | 三级属性 |
属性的目录结构如下:
* NSAppTransportSecurity
* NSAllowsArbitraryLoads
* NSExceptionDomains
* < domain-name-for-exception-as-string >
* NSExceptionMinimumTLSVerion
* NSExceptionRequiresForwardSecrecy
* NSExceptionAllowsInsecureHTTPLoads
* NSIncludesSubdomains
* NSThirdPartyExceptionMinimumTLSVersion
* NSThirdPartyExceptionRequiresForwardSecrecy
* NSThirdPartyExceptionAllowsInsecureHTTPLoads
属性详解
NSAppTransportSecurity
: 一个用于配置App Transport Security行为的属性,在Info.plist
中是于Bundle Identifier
同一级别的属性。NSAllowsArbitraryLoads
: 一个用于针对不在NSExceptionDomains
中的配置项。如果设置成YES
,则对于那些不在NSExceptionDomains
的域则不需要通过ATS
的验证。默认值是No
。NSExceptionDomains
: 用于配置例外的配置项,即在该配置项中的域不需要通过ATS
的验证。< domain-name-for-exception-as-string >
: 需要添加例外的域名字符串,如:www.baidu.com
NSExceptionMinimumTLSVerion
: 用于指定例外域名的TSL的版本号,可用的配置有TLSv1.0
、TLSv1.1
以及TLSv1.2
三个配置项。NSExceptionRequiresForwardSecrecy
: 用于指定所配置的域协议是否在ATS
的所要求的第三点中。如果是YES
,则说明所配置的域符合要求的第三点,如果是NO
, 则加密算法必须是以下这几种。默认值是YES
。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_SHANSExceptionAllowsInsecureHTTPLoads
: 用于指明所配置的域是否个HTTPS的服务器。用这个配置可用访问那些没有证书、自签名证书、过期证书以及证书与域名匹配不上的服务器。默认值是NO
。NSIncludesSubdomains
: 用于指明子域名是否使用同样的配置。默认值是NO
。NSThirdPartyExceptionMinimumTLSVersion
: 该变量在如果是域名为第三的域名,且开发人员无法控制的情况下进行配置。NSThirdPartyExceptionRequiresForwardSecrecy
: 该变量在如果是域名为第三的域名,且开发人员无法控制的情况下进行配置。NSThirdPartyExceptionRequiresForwardSecrecy
: 该变量在如果是域名为第三的域名,且开发人员无法控制的情况下进行配置。
事例讲解
只有HTTPS
如果你的APP所访问的所有的服务器都只有HTTPS的话,那么恭喜你,完全不需要配置ATS你的App即可使用,也就是说iOS 9中的ATS对你来说并没有什么卵用。
所有网址都不经过ATS(关闭ATS)
这个配置最简单,只要通过配置NSAllowsArbitraryLoads
,将其设置成No即可。具体如下:
所有网址都经过ATS,添加一些例外(白名单)
如果你想App中的网址都通过ATS验证,只有少数一些网址例外的话,你可以为少数的网址添加NSExceptionDomains
,并且在下面添加你需要添加的网址即可。然后对每个网址进行分别的设置,其中将NSIncludeSubdomains
以及NSExceptionAllowsInsecureHttpLoads
设置成YES,即可不通过ATS验证。具体如下:
所有网址都不经过ATS,添加例外
如果你想App大部分的网址都不经过ATS,少数几个网址通过ATS验证的话,你可以先将NSAllowsArbitraryLoads
设置成YES,这样就可以使所有网址都不经过ATS,然后将少数一些需要经过ATS验证的网址添加到NSExceptionDomains
中,并将NSExceptionAllowsInsecureHTTPLoads
设置成NO即可。具体如下:
使用低等级版本的TLS协议
如果你使用的服务器没办法支持TLS1.2的协议的话,也不大要紧,可以通过配置来支持低版本的TLS协议。将对应没办法进行高版本的服务器在NSExceptionDomains
下建立一个的对应的域名,在对应域名下添加NSExceptionRequiresForwardSecrecy
设置成NO并且将NSExceptionMinimumTLSVersion
设置成对应的TLS的版本号即可。具体如下:
如何配置
其实在Mac OS X 10.11中,苹果给我们提供了个超牛逼的功能,简单来说就是提供了一个命令行的工具来产生对应的配置项给我们。但是由于我没有升级到Mac OS X10.11X所以我就没办法进行测试了。至于其中的奥秘,等更新了系统之后再进行补充。