最近为了新的存管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?

iOS开发之NSURLSession/NSURLConnection HTTP load failed 的解决办法相关推荐

  1. IOS开发之JSON序列化从客户端发送到服务器端

    IOS开发之JSON序列化从客户端发送到服务端的准备工作 共有6种情况 需要序列化 请查看源代码. 服务器端接受我们采用的是java的Tomcat服务器.配合 struts 2 controller框 ...

  2. Swift网络开发之NSURLSession学习笔记

    为什么80%的码农都做不了架构师?>>>    Swift网络开发之NSURLSession学习笔记 先上效果图:        功能: -单个任务下载 -暂停下载任务 -取消下载任 ...

  3. iOS开发之Objective-C(中级篇)-李飞-专题视频课程

    iOS开发之Objective-C(中级篇)-307人已学习 课程介绍         该系列课程详细的讲解了iOS开发过程中的常用知识点及难点.在此基础上面,还扩充讲解了数据库的和H5的知识.如果能 ...

  4. iOS开发之AVKit框架使用

    2019独角兽企业重金招聘Python工程师标准>>> iOS开发之AVKit框架使用 一.引言 在iOS开发框架中,AVKit是一个非常上层,偏应用的框架,它是基于AVFounda ...

  5. (0045) iOS 开发之MBProgressHUD 源码学习

    (0045) iOS 开发之MBProgressHUD 源码学习 第一部分:学习所得和分析线程 1.  学习到了kvo 的使用 和屏幕方向的旋转判断. 2. 如果调起这个 HUD 的方法不是在主线程调 ...

  6. (0016)iOS 开发之Mac上Navicat Premium 创建远程连接和本地连接

    1.下载安装 (百度云盘里面有安装文件和注册机) 链接: https://pan.baidu.com/s/1kVG1k71 密码: mr5g 破解教程看这篇博客:http://blog.csdn.ne ...

  7. 李洪强iOS开发之RunLoop的原理和核心机制

    李洪强iOS开发之RunLoop的原理和核心机制 搞iOS之后一直没有深入研究过RunLoop,非常的惭愧.刚好前一阵子负责性能优化项目,需要利用RunLoop做性能优化和性能检测,趁着这个机会深入研 ...

  8. IOS开发之MD5加密和钥匙串的使用-oc

    IOS开发之MD5加密和钥匙串的使用-oc 源码在我的主页,md5加密是用户登录安全的一个保障.不可逆的,可以暴力破解的. // // ViewController.m // MD5演练 // // ...

  9. IOS开发之CALayer基本属性和使用

    IOS开发之CALayer基本属性和使用 // // ViewController.m // CALayer // // Created by 鲁军 on 2021/2/21. //#import & ...

  10. ios开发之plist 的文件的读写以及沙盒容器路径打印

    ios开发之plist 的文件的读写以及沙盒容器路径打印 核心代码在这里 // // ViewController.m // 21-plist存储和沙盒路径 // // Created by 鲁军 o ...

最新文章

  1. 实战篇-简单多语言的实现
  2. 三菱d700变频器接线图_昆明市三菱恒压供水变频器接线图
  3. HDU-4059 The Boss on Mars 容斥定理
  4. COGS 36. 求和问题
  5. Linux下将数据文件的指定域读取到shell脚本中
  6. CentOS6.5 搭建 LNMP (linux + nginx + mysql + php)
  7. python3 枚举_Python3枚举类如何处理重复名称?
  8. 喜提 300w 硬核资产!
  9. IT男,程序猿在婚恋市场有多受欢迎?
  10. 代码整洁之道 python_Python代码整洁之道:编写优雅的代码
  11. 计算机中的文件及文件命名规则,文件名的命名规则是什么
  12. Rendezvous on a Tetrahedron (模拟)
  13. 您使用的是不受支持的命令行标记 -no-sandbox
  14. 四层负载均衡 动静分离和资源分离 Rewrite rewrite伪静态实例
  15. unity 实现物体破碎效果的一些方法 - 细雨淅淅
  16. GC.SuppressFinalize()的正确用法
  17. linux固态硬盘检测,linux 检查硬盘是 SSD or HDD
  18. 【新技术】:移动支付过程中的NFC技术
  19. 实现a标签中的各种点击(onclick)事件的方法
  20. 【测试分析】KYM全面收集测试信息

热门文章

  1. 启动与关闭VMware Workstation的BAT批处理脚本
  2. 摘自网络上总结出的一些开源的技术
  3. Logistic回归小结
  4. wireshark的简单使用:在二进制流中还原出zip文件
  5. 常见 HTTP/FTP/WebSocket 错误代码大全 - 转
  6. Azure 托管镜像和非托管镜像对比
  7. Glassfish 设置时区
  8. 【实例】原生 js 实现全屏滚动效果
  9. javascript 中XMLHttpRequest 实现前台向后台的交互
  10. C#1所搭建的核心基础