iOS之苹果双重验证的原理

为什么要做双重验证?

debug模式下,安装包不需要上传到App Store,可以直接安装到手机上。苹果为了保证系统的安全性,又必须对安装的APP有绝对的控制权。APP必须经过苹果允许才可以安装,不能被滥用导致非开发APP也能被安装。为了实现这些需求,iOS签名的复杂度也就开始增加了,苹果这里给出的方案是双层签名。

双重代码签名的实现流程

图1

说明:

iOS的双层代码签名流程这里简单梳理一下,这也不是最终的iOS签名原理。iOS的最终签名在这个基础上还要稍微加点东西。

首先这里有两个角色。一个是iOS系统 还有一个就是我们的Mac系统,因为iOS的APP开发环境在Mac系统下,所以这个依赖关系成为了苹果双层签名的基础。

步骤:

1.在Mac系统中生成非对称加密算法的一对公钥\私钥(你的Xcode帮你代办了).这里称为公钥M 私钥M 。 M = Mac

2.苹果自己有固定的一对公私钥,跟之前App Store原理一样,私钥在苹果后台,公钥在每个iOS系统中.这里称为公钥A , 私钥A. A=Apple

3.把公钥M 以及一些你开发者的信息,传到苹果后台(这个就是CSR文件),用苹果后台里的私钥 A 去签名公钥M。得到一份数据包含了公钥M 以及其签名,把这份数据称为证书

4.在开发时,编译完一个 APP 后,用本地的私钥 M(今后你导出的P12) 对这个 APP 进行签名,同时把第三步得到的证书一起打包进 APP 里,安装到手机上。

5.在安装时,iOS 系统取得证书,通过系统内置的公钥 A,去验证证书的数字签名是否正确。

6.验证证书后确保了钥 M 是苹果认证过的,再用公钥 M 去验证 APP 的签名,这里就间接验证了这个 APP 安装行为是否经过苹果官方允许。(这里只验证安装行为,不验证APP 是否被改动,因为开发阶段 APP 内容总是不断变化的,苹果不需要管。)

注意:以上的操作会存在一个重大的bug,苹果是绝对不允许这样的事情发生的。就是这样子操作的话我们可以不经过苹果的服务器生成证书,自己进行验证就可以安装APP,所以就引申出了描述文件。

描述文件

描述文件(Provisioning profile)一般包括三样东西:证书、App ID、设备信息、权限信息。当我们在真机运行或者打包一个项目的时候,证书用来证明我们程序的安全性和合法性。

图2

苹果为了解决应用滥用的问题,所以苹果又加了两个限制:

第一限制在苹果后台注册过的设备才可以安装。

第二限制签名只能针对某一个具体的APP。

并且苹果还想控制App里面的iCloud/PUSH/后台运行/调试器附加这些权限,所以苹果把这些权限开关统一称为Entitlements(授权文件).并将这个文件放在了一个叫做Provisioning Profile(描述文件)文件中。

描述文件是在AppleDevelop网站创建的(在Xcode中填上AppleID它会代办创建),Xcode运行时会打包进入APP内。

所以我们使用CSR申请证书时,我们还要申请一个东西!! 就是描述文件!

在开发时,编译完一个 APP 后,用本地的私钥M对这个APP进行签名,同时把从苹果服务器得到的 Provisioning Profile 文件打包进APP里,文件名为embedded.mobileprovision,把 APP 安装到手机上。最后系统进行验证。

注意:描述文件不能篡改,也别想着改,改的话就验证不通过了。当需要新的描述文件时候只能够重新向苹果服务器生成。






你可能感兴趣的:(iOS之苹果双重验证的原理)