iOS9 - NSAppTransportSecurity

久未见 提交于 2019-11-29 12:33:27

iOS9 - NSAppTransportSecurity

原文地址:http://www.pluto-y.com/ios9-nsapptransportsecurity/

App Transport Security(以下均称ATS)是iOS9提供的一个新特性,主要是保证app和web服务之间的安全。如果不想开启的话,可以关闭这个特性。

所有用到NSURLConnectionCFURL以及NSURLSessionAPI都会触发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.0TLSv1.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_SHA

  • NSExceptionAllowsInsecureHTTPLoads : 用于指明所配置的域是否个HTTPS的服务器。用这个配置可用访问那些没有证书、自签名证书、过期证书以及证书与域名匹配不上的服务器。默认值是NO

  • NSIncludesSubdomains : 用于指明子域名是否使用同样的配置。默认值是NO
  • NSThirdPartyExceptionMinimumTLSVersion : 该变量在如果是域名为第三的域名,且开发人员无法控制的情况下进行配置。
  • NSThirdPartyExceptionRequiresForwardSecrecy : 该变量在如果是域名为第三的域名,且开发人员无法控制的情况下进行配置。
  • NSThirdPartyExceptionRequiresForwardSecrecy : 该变量在如果是域名为第三的域名,且开发人员无法控制的情况下进行配置。

事例讲解

只有HTTPS

如果你的APP所访问的所有的服务器都只有HTTPS的话,那么恭喜你,完全不需要配置ATS你的App即可使用,也就是说iOS 9中的ATS对你来说并没有什么卵用。

所有网址都不经过ATS(关闭ATS)

这个配置最简单,只要通过配置NSAllowsArbitraryLoads,将其设置成No即可。具体如下:
关闭ATS

所有网址都经过ATS,添加一些例外(白名单)

如果你想App中的网址都通过ATS验证,只有少数一些网址例外的话,你可以为少数的网址添加NSExceptionDomains,并且在下面添加你需要添加的网址即可。然后对每个网址进行分别的设置,其中将NSIncludeSubdomains以及NSExceptionAllowsInsecureHttpLoads设置成YES,即可不通过ATS验证。具体如下:
部分添加例外的配置

所有网址都不经过ATS,添加例外

如果你想App大部分的网址都不经过ATS,少数几个网址通过ATS验证的话,你可以先将NSAllowsArbitraryLoads设置成YES,这样就可以使所有网址都不经过ATS,然后将少数一些需要经过ATS验证的网址添加到NSExceptionDomains中,并将NSExceptionAllowsInsecureHTTPLoads设置成NO即可。具体如下:
部分通过ATS配置

使用低等级版本的TLS协议

如果你使用的服务器没办法支持TLS1.2的协议的话,也不大要紧,可以通过配置来支持低版本的TLS协议。将对应没办法进行高版本的服务器在NSExceptionDomains下建立一个的对应的域名,在对应域名下添加NSExceptionRequiresForwardSecrecy设置成NO并且将NSExceptionMinimumTLSVersion设置成对应的TLS的版本号即可。具体如下:
低等级协议配置

如何配置

其实在Mac OS X 10.11中,苹果给我们提供了个超牛逼的功能,简单来说就是提供了一个命令行的工具来产生对应的配置项给我们。但是由于我没有升级到Mac OS X10.11X所以我就没办法进行测试了。至于其中的奥秘,等更新了系统之后再进行补充。

转载于:https://my.oschina.net/youtk21ai/blog/540704

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