关于iOS9中的App Transport Security(ATS)相关说明及适配

2023-11-13

iOS9中新增App Transport Security(简称ATS)特性, 主要使到原来请求的时候用到的HTTP,都转向TLS1.2协议进行传输。这也意味着所有的HTTP协议都强制使用了HTTPS协议进行传输。原文如下:

App Transport Security

 

App Transport Security (ATS) enforces best practices in the secure connections between an app and its back end. ATS prevents accidental disclosure, provides secure default behavior, and is easy to adopt; it is also on by default in iOS 9 and OS X v10.11. You should adopt ATS as soon as possible, regardless of whether you’re creating a new app or updating an existing one.

If you’re developing a new app, you should use HTTPS exclusively. If you have an existing app, you should use HTTPS as much as you can right now, and create a plan for migrating the rest of your app as soon as possible. In addition, your communication through higher-level APIs needs to be encrypted using TLS version 1.2 with forward secrecy. If you try to make a connection that doesn‘t follow this requirement, an error is thrown. If your app needs to make a request to an insecure domain, you have to specify this domain in your app‘s Info.plist file

如果我们在iOS9下直接进行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.

系统会告诉我们不能直接使用HTTP进行请求,需要在Info.plist新增一段用于控制ATS的配置:

<key>NSAppTransportSecurity</key><dict>
    <key>NSAllowsArbitraryLoads</key>
    <true/></dict>

也即:


这段配置中的NSAppTransportSecurity是ATS配置的根节点,配置了节点表示告诉系统要走自定义的ATS设置。而NSAllowsAritraryLoads节点则是控制是否禁用ATS特性,设置YES就是禁用ATS功能。

直到前面的配置可以完美的适配iOS9了(亲测),但是如果你想遵循苹果给出的标准,让自己的数据更加安全,那么需要继续往下看。

其实ATS并不单单针对HTTP进行了限制,而是对HTTPS也有一定的要求,以百度的地址为例,如果在App中请求https://baidu.com的话,是会收到如下的错误信息:

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

查阅了一下官方资料(https://developer.apple.com/library/prerelease/ios/technotes/App-Transport-Security-Technote/),发现HTTPS的请求需要满足下面的要求:


These are the App Transport Security requirements:


  • The protocol Transport Security Layer (TLS) must be at least version 1.2.

  • Connection ciphers are limited to those that provide forward secrecy (see the list of ciphers below.)

  • Certificates must use at least an SHA256 fingerprint with either a 2048 bit or greater RSA key, or a 256 bit or greater Elliptic-Curve (ECC) key.

根据原文描述,首先必须要基于TLS 1.2版本协议。再来就是连接的加密方式要提供Forward Secrecy(正向保密?这个不清楚是什么,好奇的筒子找资料吧~),文档中罗列出支持的加密算法(如下表)。最后就是证书至少要使用一个SHA256的指纹与任一个2048位或者更高位的RSA密钥,或者是256位或者更高位的ECC密钥。如果不符合其中一项,请求将被中断并返回nil。

支持Forward Secrecy的加密方式

  • 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

我们再来看刚才的百度的地址,用浏览器打开百度的地址,然后点击链接前面的锁图标,如图:


可以看到它使用了TLS 1.2版本协议,符合第一个约定。然后可以看到使用AES_128_GCM进行加密,并使用ECDHE_RSA作为密钥交换机制的,我们可以在Forward Secrecy的列表中找到对应两条记录:

  • TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384

  • TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256

但是还不能确定百度是否提供Forward Secrecy,我们再点开证书信息,查看“签发者名称”和“公共密钥信息”两项,如图:


看到签名算法中写着“带RSA加密的SHA-1”。可以判定该加密算法不包含在上面两项中。因此百度是一个不符合ATS的要求,所以返回了错误。这时候,如果要解决这样的问题,同样需要对ATS进行配置。配置如下:

<key>NSAppTransportSecurity</key>
	<dict>
		<key>NSExceptionDomains</key>
		<dict>
			<key>baidu.com</key>
			<dict>
				<key>NSIncludesSubdomains</key>
				<true/>
				<key>NSExceptionRequiresForwardSecrecy</key>
				<false/>
                                <key>NSExceptionAllowsInsecureHTTPLoads</key>
                                <true/>
			</dict>
		</dict>
	</dict>

其中NSIncludesSubdomains设置为YES表示百度的子级域名都使用相同设置。NSExceptionRequiresForwardSecrecy为NO由于百度不支持ForwardSecrecy,因此屏蔽掉改功能。最后NSExceptionAllowInsecureHTTPLoads设置为YES,则表示允许访问没有证书或者是自签名、过期、主机名不匹配的证书引发的错误的域名(这里检查过百度的证书貌似没有什么问题,但是还是需要设置此项才允许访问)。


http://www.bubuko.com/infodetail-1050702.html


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

关于iOS9中的App Transport Security(ATS)相关说明及适配 的相关文章

  • 从 iOS 13 开始安排 iOS 后台任务

    我正在实现用于更新数据的BackgroundTasks 框架 但我遇到了以下问题 无法计划刷新App 错误域 BGTaskSchedulerErrorDomain代码 1 空 无法安排数据提取 Error Domain BGTaskSche
  • 以编程方式从底部裁剪图像

    我正在开发自定义相机应用程序 一切进展顺利 但我在从底部裁剪图像时遇到了问题 即 裁剪后的图像与原始图像具有完全相同的宽度 但高度将为原始图像的 1 3 并且必须从底部开始 斯威夫特3解决方案 func cropBottomImage im
  • ios 在后台处理推送通知

    我想保存应用程序处于后台状态时到达的推送通知 我知道关于 void application UIApplication application didReceiveRemoteNotification NSDictionary userIn
  • AWS S3 公共对象与私有对象?

    回到 S3 我的存储桶中有图像的 URL 我将在我的应用程序中呈现这些图像 但它们被设置为私有 当我尝试单击该链接时 它显示 访问被拒绝 当我将链接的设置更改为公共时 它会通过 但是我读到公共访问并不是最安全的事情 所以这本质上是一个由两部
  • ios - 在哪里放置 s.static_framework = true

    我在 CocoaPods 中的级别为 0 当我使用pod install有一个错误说 The Pods App target has transitive dependencies that include static framework
  • 如何将相机中的图像保存到 iPhone 图库中的特定文件夹?

    嘿 我是 iPhone 新手 最近我一直在尝试制作一个应用程序 基本上 我想要做的是 如果用户将从相机捕获任何图像 那么它应该保存在设备库中 我知道如何将照片保存在图库中 它对我有用 但我无法将所有捕获的图像保存到设备图库中的特定文件夹 例
  • iOS 上的 UIBezierPath 操作

    我从一条直线开始 我希望用户能够触摸并拖动该线 使其弯曲 实际上 他们有能力将线条操纵成波浪形状 我不确定从技术上实现这一目标的最简单方法 我首先创建了三次曲线的 UIBezierPaths 数组 目的是操纵控制点 但似乎一旦绘制了 UIB
  • SwiftUI:状态栏颜色

    有没有办法将 SwiftUI 视图的状态栏更改为白色 我可能错过了一些简单的东西 但我似乎找不到在 SwiftUI 中将状态栏更改为白色的方法 到目前为止我只看到 statusBar hidden Bool 状态栏文本 色调 前景色可以通过
  • 从 iOS 应用程序内的 Junos Pulse 获取用户凭据

    我正在通过 Junos Pulse 在 iPad 中建立 VPN 连接 以进入我组织的 Intranet 谁能告诉我是否有任何 iOS api 或 SDK 可用于获取在 iOS 应用程序内的 Junos pulse 中输入的用户凭据 Jun
  • Objective-c 中的块递归

    当执行涉及 Objective C 块的递归时 我在 iOS 应用程序中收到 EXC BAD ACCESS 信号 这是简化的代码 void problematicMethod FriendInfo friendInfo onComplete
  • 在带有 Storyboard 的 XCode 4 中以模态方式推送视图时,出现“对开始/结束外观转换的不平衡调用”警告

    在网上进行了一些研究但没有成功后 我来这里向您询问有关我的警告的问题 实际上 我有一个带有导航控制器的视图 V1 我想在 V1 完成加载时推送模态视图 V2 所以我用performSegueWithIdentifier方法 我正在使用故事板
  • 为什么我不能在 Realm 属性上使用 private

    我正在尝试在 RealmSwift 中存储一个枚举案例 但 Realm 不支持枚举 本文 https medium com it works locally persisting swift enumerations with realm
  • 检测 AvPlayer 何时切换比特率

    在我的应用程序中 我使用 AVPlayer 通过 HLS 协议读取一些流 m3u8 文件 我需要知道在流会话期间 客户端切换比特率多少次 我们假设客户端的带宽正在增加 因此客户端将切换到更高比特率的段 AVPlayer能检测到这个开关吗 T
  • 在现有 iOS 应用程序中集成 React-native(0.40.0) 后找不到 Yoga/Yoga.h 头文件

    在我的 Swift iOS 应用程序中集成 React Native 后 我无法构建 yoga Yoga h file cannot be found 我已经浏览了文档 查看了react native github页面 检查了类似问题的SO
  • WhatsApp 显示警告“此项目无法共享。请选择其他项目。”对于 iOS 应用程序。

    我正在开发一个 iOS 应用程序 在该应用程序中 我有社交共享功能 并且社交共享功能使用深度链接来共享 URL 该网址共享对于所有应用程序都运行良好 除了WhatsApp 它会显示一个警报弹出窗口 此项目无法共享 请选择其他项目 以下是我的
  • 避免 UIImage 的 imageNamed - 内存管理

    我正在经历这个链接 http akosma com 2009 01 28 10 iphone memory management tips 我遇到了一个点避免 UIImage 的 imageNamed 出于什么原因我们应该避免这种情况 它会
  • 如何反转 CGPath 的点顺序

    我想画一个圆圈 并用它打出字母 为此 我需要顺时针抚摸圆圈 逆时针抚摸字母 这一切都很好 但是当我使用 Core Text 获取字母路径时 我不知道如何从本质上反转该路径 不是镜像或旋转或任何东西 这很简单 我希望点笔画顺序是逆时针的 这实
  • Swift C 回调 - Swift 类指针的 takeUnretainedValue 或 takeRetainedValue

    我有一些UIView or UITableViewCell 里面我有 C 回调 例如 CCallback bridge self observer data gt Void in let mySelf Unmanaged
  • 分发内部业务 IOS 应用程序

    我遇到了 IOS 应用程序分发的一个令人困惑的部分 因此 我需要简单细分一下我的限制 即仅将我的应用程序分发给我的员工 同事或任何被视为 内部 的人 这是表明我不希望该应用程序出现在应用程序商店中的另一种方式 我的情况是我为几家公司开发 他
  • IPV6 快速可达性

    我是 swift 和 xcode 的新手 并且我的应用程序因 IPV6 而被拒绝 性能 2 1 当我们执行以下操作时 您的应用程序会在运行 iOS 9 3 5 并连接到 IPv6 网络的 iPad 和 iPhone 上崩溃 具体来说 当我们

随机推荐

  • cobra 开启自动补全功能

    cobra 开启自动补全功能 因工作原因 需要将一个由 cobra 写的命令行工具 支持在 bash 和 zsh 环境开启命令行自动补全功能 网上搜了一圈 大部分都是把 cobra github 的介绍翻译一下就完了 而且没有对命令行补全的
  • 关于JAVA毕业设计三个选题推荐

    毕业设计是大学生学习生涯的最后一课 对未来职业发展有重要影响 因此 选题是一个需要慎重考虑的问题 本文将为大家推荐三个相关的JAVA毕业设计选题 希望能够给大家提供一定的参考和帮助 基于SSH框架的学生管理系统 学生管理系统是一个常见而且非
  • JsonView插件的使用

    由于谷歌浏览器经常打不开应用商店 还有就是安装第三方插件的办法 方法就如下 由于最近做和json相关的东西 所以 以jsonView插件为例分享一下 1 打开https github com 2 搜索 jsonView 链接 https g
  • class组件使用静态变量 并且通过react编译

    ok 这种情况直接使用 babelrc 然后 npm start 会出现下面err 我试着通过 babelrc 配置 presets babel preset env babel preset react plugins babel plu
  • Mysql学习笔记九--子查询

    1 mysql表子查询 子查询是指嵌入在其他sql语句中的select语句 也叫嵌套查询 单行子查询 指只返回一行数据的子查询语句 多行子查询 指返回多行数据的子查询 使用关键字 in 如何查询和部门10的工作相同的但是不包含10号部门自己
  • 多输入多输出

    多输入多输出 MATLAB实现BP神经网络多输入多输出预测 目录 多输入多输出 MATLAB实现BP神经网络多输入多输出预测 预测效果 基本介绍 程序设计 参考资料 预测效果
  • 服务的边界

    服务边界是服务拆分和集成的前提 1 识别业务领域及边界 当前主要方法论 领域驱动设计 领域可简单理解为特定的业务系统 其中主要的设计维度为策略维度和技术维度 待完善 2 界限上下文 就是根据界限 边界 确定上下文 具体的业务场景 3 服务边
  • css3 transform + deviceorientation实现图片旋转效果

    1 陀螺仪deviceorientation的使用 参考 关于陀螺仪deviceorientation https segmentfault com a 1190000007183883 2 transform各属性的具体使用 参考 深入理
  • 计算机组成原理——单周期CPU

    单周期CPU 项目代码 实验原理 MIPS指令 rom coe文件 代码 顶层模块SingleCycleCPU display外围模块 PC instructionMemory Alu模块 DataMemory ControlUnit 旧的
  • 排序(六):归并排序

    排序算法系列文章 排序 一 冒泡排序 排序 二 选择排序 排序 三 堆排序 排序 四 插入排序 排序 五 二分搜索 排序 六 归并排序 排序 七 快速排序 排序 八 希尔排序 目录 排序算法系列文章 归并排序 Merge Sort 基本思想
  • Python之文件的读写

    文章目录 前言 一 打开和关闭文件 open和close 1 打开文件 2 关闭文件 mode的方式 几种读取文件的函数 写入文件的函数 二 with open as操作文件 1 with open as与open close的区别 总结
  • Ubuntu部署OpenStack zed版本neutron报错:Feature ‘linuxbridge‘ is experimental and has to be explicitly enab

    系统版本 Ubuntu 22 04 1 LTS OpenStack版本 zed 组件 Neutron 组件报错内容 Feature linuxbridge is experimental and has to be explicitly e
  • GLSL中texture3D获得的值大小

    使用OpenGL的glTexImage3D 获得纹理数据 再在片元着色器对数据进行处理texture3D 得到的数据已被压缩到0 1 openGL函数glTexImage3D导入数据后 在GLSL中 数据被进行了压缩 glTexImage3
  • python3GUI--音乐播放器(精简版)By:PyQt5(附下载地址)

    文章目录 一 前言 二 预览 1 主界面 2 歌单页 3 歌词页 4 播放列表 5 mini 6 设置 三 心得 1 解耦 2 体验优化 3 歌词显示 4 双击歌曲后发生什么 四 总结 一 前言 传送门 1 python3GUI 打造一款音
  • 关于Linux下的pid文件

    1 pid文件的内容 用cat命令查看 可以看到内容只有一行 记录了该进程的ID 2 pid文件的作用防止启动多个进程副本 3 pid文件的原理进程运行后会给 pid文件加一个文件锁 只有获得pid文件 固定路径固定文件名 写入权限 F W
  • Elasticsearch聚合分析、mget批量查询、bulk批量更新

    Elasticsearch分组集合 一 分组聚合操作 开启fielddata属性 1 在ElasticSearch中默认fielddata默认是false的 因为开启Text的fielddata后对内存的占用很高 如果进行聚合查询时候就需要
  • Redfish协议测试工具–Postman

    1 工具和资料获取 2 简单使用说明 1 GET类举例 2 PATCH类举例 3 常见命令 1 工具和资料获取 Postman工具获取 服务器Redfish接口说明文档 使用前必读接口文档中 适用的产品 查看自己的服务器是否支持此协议 2
  • 简单sql注入

    报错注入找列数 确定为16 联合查询找回显点 查询数据库和数据库版本 版本为5 0以上 需要对查询的内容加密否则报错 结果不是需要的 查询所有的表 获得表名cms users 获得字段usename password 得到账号密码
  • 用java代码验证char类型数据占几个字节

    char为字符型数据 储存单个字符 但阿拉伯数字 英文字母 标点符号等皆为字符型数据 占用字节看似错综复杂 但是char也为脱离计算机基本 二进制储存机制 char本质上内存中皆存储字符编码 1 127为ASCII码 也就是常用的字符 但在
  • 关于iOS9中的App Transport Security(ATS)相关说明及适配

    iOS9中新增App Transport Security 简称ATS 特性 主要使到原来请求的时候用到的HTTP 都转向TLS1 2协议进行传输 这也意味着所有的HTTP协议都强制使用了HTTPS协议进行传输 原文如下 App Trans