~ read.

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的话,都可以在配置文件中进行配置。关于配置项可以参考下表: NSAppTransportSecurity表-由于没办法用markdown的语法,暂时使用图片

属性的目录结构如下:

  • 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所以我就没办法进行测试了。至于其中的奥秘,等更新了系统之后再进行补充。

comments powered by Disqus