iOS9的ATS(App Transport Security)

本文分析了iOS9中App Transport Security(ATS)机制导致的HTTPS连接失败问题,并提供了具体的解决方案,包括如何配置info.plist来禁用ATS。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

注:本文仅适用于iOS9,最新的iOS10机制有所更新。(2016.9.19)


0x00问题

在建立HTTPS连接时,在iOS8上测试正常的代码,在iOS9报错:

NSURLSession/NSURLConnectionHTTP load failed (kCFStreamErrorDomainSSL, -9802)

 

0x01分析

原因是iOS9引入了新的机制,App Transport Security(ATS)。ATS将所有HTTP连接强制转化为HTTPS。对于服务器有如下要求:

1.支持TLSV1.2

2.证书必须由SHA-2ECC(密钥256位以上)或RSA(密钥2048位以上)

3.服务器须支持forwardsecrecy(FS):

  • 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

 

官方资料链接:https://developer.apple.com/library/prerelease/ios/documentation/General/Reference/InfoPlistKeyReference/Articles/CocoaKeys.html

 

检查服务器配置后发现,证书的签名算法时SHA1,不满足以上要求,因此连接会被系统拒绝。

 

0x02NSAppTransportSecurity

 

在info.plist文件中加入以下代码,可以关闭ATS,就不会报错了。

 

<key>NSAppTransportSecurity</key>

<dict>

<key>NSAllowsArbitraryLoads</key>

<true/>

</dict>

 

 

 

NSAppTransportSecurity配置项如下:

 

 

Key

Type

Description

NSExceptionDomains

Dictionary

定义特殊的域名,每个key是一个域名的字符串。通过定义它可以标志对于某些域名特殊处理。

NSIncludesSubdomains

Boolean

如果设置为YES,将规则应用到所有子域名。默认为NO

NSExceptionAllowsInsecureHTTPLoads

Boolean

如果设置为YES,允许指定的域名使用不安全的HTTP访问。将允许无证书的连接,证书不合法,主机名和证书中不符合等情况。默认值为NO

NSExceptionRequiresForwardSecrecy

Boolean

  • 控制域名是否支持forward secrecy(FS)

    默认值是YES,使用ATS连接时必须使用以下加密算法

    • 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

NSExceptionMinimumTLSVersion

String

  • 设置TLS(Transport Layer Security)的最低支持版本,可选值为:

    • TLSv1.0
    • TLSv1.1
    • TLSv1.2(默认值)

NSAllowsArbitraryLoads

Boolean

如果设置为YES,所有NSExceptionDomains没有列出的域名将不使用ATS。默认为NO。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值