iOS学习之旅10 ATS(App Transport Security)对HTTPS协议要求引起的问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了iOS学习之旅10 ATS(App Transport Security)对HTTPS协议要求引起的问题相关的知识,希望对你有一定的参考价值。

问题描述

编写以下代码获取网络某个资源的MIMEType

 1 -(void)getMIMEType
 2 {
 3     //路径
 4     NSURL *url = [NSURL URLWithString:@"https://www.baidu.com/img/bd_logo1.png"];
 5     //请求对象
 6     NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
 7     NSOperationQueue *queue = [[NSOperationQueue alloc]init];
 8     [NSURLConnection sendAsynchronousRequest:request queue:queue completionHandler:^(NSURLResponse * _Nullable response, NSData * _Nullable data, NSError * _Nullable connectionError) {
 9         NSLog(@"%@",response.MIMEType);
10     }];
11 }

运行提示如下错误:

NSURLSession/NSURLConnection HTTP load failed (kCFStreamErrorDomainSSL, -9802),同时请求返回的结果为nil

技术分享

问题解析

ATS要求

因为苹果在ios9引入隐私保护功能ATS(App Transport Security)屏蔽HTTP协议,在学习过程中遇到HTTP相关问题,因此写了这篇文章 iOS学习之旅7 ATS安全功能屏蔽HTTP协议 ,但今天又遇到ATS上的问题。

在iOS 9.0及以后版本和OS X10.11及以后版本编译的应用中,所有使用NSURLConnection、 CFURL、或 NSURLSession的连接都使用ATS默认行为。ATS不遵守以下要求的连接将会失败并断开。

  • 服务器必须至少支持传输层安全(TLS)协议版本1.2。
  • 连接的密码仅限于提供完全正向保密的密码(perfect forward secrecy)。(参见下面的密码列表)
  • 证书必须使用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

完全正向保密(perfect forward secrecy)

查了下资料,完全正向保密(perfect forward secrecy)要求一个密钥只能访问由它所保护的数据;不能使用保护数据传输的密钥派生其他密钥。此外,也不能使用保护数据传输的密钥的源派生其他密钥;一个密钥被破解, 并不影响其他密钥的安全性。确保密钥的长期保密材料不会影响来自以前通信的已交换密钥的保密性。

“TLS” 自然是指TLS协议。 “ECDHE” 是说使用带有短暂性密钥的椭圆曲线Diffie-Hellman密钥交换(也就是说要为每个会话创建新密钥并且事后也不会记下来)。“RSA”表明用 RSA 非对称加密保护TLS握手的安全。 “AES_128_CBC” 是说在密码块链接模式中用带有128位密钥的AES 非对称加密保护真正的数据交换。最后的 “SHA” 表明用 SHA 安全哈希算法。

 

问题解决

以上是关于iOS学习之旅10 ATS(App Transport Security)对HTTPS协议要求引起的问题的主要内容,如果未能解决你的问题,请参考以下文章

iOS10 适配 ATS(app支持https通过App Store审核) 韩俊强的博客

iOS 10 适配 ATS(app支持https通过App Store审核)

iOS 10 适配 ATS(app支持https通过App Store审核)

关于 iOS 10 中 ATS 的问题

关于 iOS 10 中 ATS 的问题

关于 iOS 10 中 ATS 的问题