最近为了新的存管app上线,忙了近一个月,重新过了一段996的日子,今天终于可以喘口气,继续更新博客了。本文记录一下在iOS 9中发送https请求遇到的问题及解决办法,希望通过本文,可以对ATS 的配置有一个更深入的了解。

问题描述

在开发app时,遇到了在iOS 9中发送https请求报错的问题:

NSURLSession/NSURLConnection HTTP load failed (kCFStreamErrorDomainSSL, -9801)

我们知道,在iOS 9以后,所有的网络请求默认使用https,如果你发送http请求,则会报如下错误,但是我们可以通过在info.plist中设置NSAppTransportSecurity - NSAllowsArbitraryLoads的值为YES来允许http请求:

App Transport Security has blocked a cleartext HTTP (http://) resource load since it is insecure. Temporary exceptions can be configured via your app's Info.plist file.

info.plist

这样解决了http的请求问题,但是我发送是https请求,还是出现HTTP laod failed的问题,尽管使用上述方法也可以解决,但这不是根本的解决办法。

解决办法

经过分析,怀疑是TLS的问题,因为iOS 9默认需要TLS1.2版本来加密数据,如果服务端不支持TLS1.2,则URLSession:task:didCompleteWithError:会返回nilerror,但是后端开发同事说服务器支持TLS1.0TLS1.1TLS1.2,这好像又不是TLS的问题。于是不放心,用nscurl测试了一下测试服务器,果然不支持TLS1.2,问题找到。

# 加 --verbose 是为了显示详细的调试信息
/usr/bin/nscurl --ats-diagnostics --verbose https://testresource.chaoaicai.com

通过输出看出,服务器只支持TLS1.0,于是让后台开发的同事测试并修改后,再次测试,发现服务器支持TLS1.2了,并且https的网络请求也正常了。

ATS异常配置

其实,针对服务器不支持TLS1.2,而客户端发送https请求还有其它的解决方法,就是配置ATS,设置最低的TLS版本即可,如下info.plist所示:

<key>NSAppTransportSecurity</key>
  <dict>
  <key>NSExceptionDomains</key>
  <dict>
    <!--你的https域名-->
    <key>testresource.chaoaicai.com</key>
    <dict>
      <!--允许子域-->
      <key>NSIncludesSubdomains</key>
      <true/>
      <!--TLS允许的最低版本号-->
      <key>NSExceptionMinimumTLSVersion</key>
      <string>TLSv1.0</string>
    </dict>
  </dict>
</dict>

其中,NSExceptionDomains的具体设置项介绍如下,可以更详细的了解ATS的异常配置

  • NSIncludesSubdomains:是否应用到子域名,默认是NO
  • NSExceptionAllowsInsecureHTTPLoads:是否允许http请求,YES(允许),默认是NO
  • NSExceptionMinimumTLSVersion:最低的TLS版本
  • NSExceptionRequiresForwardSecrecy:是否需要前置加密,NO(允许加密,但不支持PFS:perfect forward secrecy),默认是YES
  • NSRequiresCertificateTransparency:是否需要有效的签名证书,YES(需要),默认是NO

本文只是简单的介绍了一下如何配置ATS,及解决由于服务器不支持TLS1.2造成的https无法访问的问题,需要了解httpsTLS的具体工作流程,请参考相关资料。

参考资料

#iOS问题记录#关于NSURLSession/NSURLConnection HTTP load failed (kCFStreamErrorDomainSSL, -9801)

iOS 9 适配系列教程

iOS 9.0

整理iOS9适配中出现的坑(图文)

Cocoa Keys

NSURLSession/NSURLConnection HTTP load failed (kCFStreamErrorDomainSSL, -9802) on a subdomain?

iOS9中关于 NSURLSession/NSURLConnection HTTP load failed 的解决办法的更多相关文章

  1. NSURLSession/NSURLConnection HTTP load failed (kCFStreamErrorDomainSSL, -9802)

    本篇文章由:http://xinpure.com/nsurlsessionnsurlconnection-http-load-failed-kcfstreamerrordomainssl-9802/ ...

  2. iOS ---------NSURLSession/NSURLConnection HTTP load failed (kCFStreamErrorDomainSSL, -9813)

    遇到此问题的解决办法: 使用<NSURLSessionDelegate>中的didReceiveChallenge方法,方法中的代码如下: - (void)URLSession:(NSUR ...

  3. python导入sklearn模块出现DLL load failed的解决办法

    笔者安装的python版本是2.7.6,最近在导入sklearn(版本:0.16.1)的模块时,经常出现DLL load failed的报错,具体截图如下: 解决办法与步骤如下: 由于sklearn的 ...

  4. 升级Xcode7&iOS9后,出现NSURLSession/NSURLConnection HTTP load failed (kCFStreamErrorDomainSSL, -980X)

    在info.plist里面添加如下内容即可: <key>NSAppTransportSecurity</key> <dict> <key>NSAllow ...

  5. #iOS问题记录#关于NSURLSession/NSURLConnection HTTP load failed (kCFStreamErrorDomainSSL, -9801)

    响应Apple的号召,将APP里的HTTP请求全部升级为HTTPS,一切配置OK,正常的请求也没问题: 但,当使用SDwebImg缓存图片时,遇到了标题写的问题: 根据资料得: 这个问题的出现是因为i ...

  6. YARN加载本地库抛出Unable to load native-hadoop library解决办法

    YARN加载本地库抛出Unable to load native-hadoop library解决办法 用官方的Hadoop 2.1.0-beta安装后,每次hadoop命令进去都会抛出这样一个War ...

  7. jquery ajax success 函数 异步调用方法中不能给全局变量赋值的原因及解决办法

    jquery ajax success 函数 异步调用方法中不能给全局变量赋值的原因及解决办法   在调用一个jquery的ajax方法时我们有时会需要该方法返回一个值或者给某个全局变量赋值,可是我们 ...

  8. 5个Android开发中比较常见的内存泄漏问题及解决办法

    android中一个对象已经不需要了,但是其他对象还持有他的引用,导致他不能回收,导致这个对象暂存在内存中,这样内存泄漏就出现了.   内存泄漏出现多了,会是应用占用过多的没存,当占用的内存超过了系统 ...

  9. eclipse中运行出错:无法初始化主类的解决办法

    问题描述:eclipse中运行程序时,出现如下错误 解决办法: 出现此类:无法初始化主类有可能是因为eclipse中Java的版本与JDK的版本不匹配,我开始用的时候eclipse中用的是Java s ...

随机推荐

  1. 关于SpringMVC中text/plain的编码导致的乱码问题解决方法

    有老铁的项目出现个问题,就是用SpringMVC给前台返回一句话,是String类型的,然后前台接收到是乱码. 然后以为是简单的response的编码问题,就在方法体中开始给response设置编码, ...

  2. BufferedReaderTest

    package JBJADV003;import java.io.*;public class BufferedReaderTest { /** * @param args */ public sta ...

  3. Hadoop启动方式

    启动方式 1.逐一启动 hdfs hadoop-daemon.sh start|stop namenode|datanode|secondrynamenode yarn yarn-daemon.sh ...

  4. Unreal Engine 4 Radiant UI 入门教程(零)在场景中摆放网页

    相关的学习资源: https://forums.unrealengine.com/showthread.php?12097-PLUGIN-RadiantUI-SDK-UIs-HUDs-Interact ...

  5. JavaScript+canvas 利用贝塞尔曲线绘制曲线

    效果图: <body> <canvas id="test" width="800" height="300">< ...

  6. CJOJ 1943 【重庆八中模拟赛】寻找代表元(二分图最大匹配)

    CJOJ 1943 [重庆八中模拟赛]寻找代表元(二分图最大匹配) Description 八中一共有n个社团,分别用1到n编号. 八中一共有m个人,分别用1到m编号.每个人可以参加一个或多个社团,也 ...

  7. JavaBean规范

    JavaBean规范 (1)JavaBean 类必须是一个公共类,并将其访问属性设置为 public  ,如: public class user{ …}(2)JavaBean 类必须有一个空的构造函 ...

  8. C++第一篇--类的引入

    C++第一篇--类的引入 1. 用C语言输出两个人的信息 Person1.c:通过字符实现 #include <stdio.h> int main(int argc,int **argv) ...

  9. CSS3浏览器兼容

    不同的浏览器需要不同的前缀 -webkit chrome和safari -moz firefox -ms ie -o opera 一个炫酷标题效果: HTML: <!DOCTYPE HTML&g ...

  10. 认识cpu、核与线程

    作为一个后台开发人员,我想有必要了解这些基础知识.如果本文有不严谨或者疏忽的地方,请指正. cpu与核心 物理核 物理核数量=cpu数(机子上装的cpu的数量)*每个cpu的核心数 虚拟核 所谓的4核 ...