iOS应⽤签名原理浅析

305 阅读6分钟

1. 前文

还记得刚开始开发iOS APP的时候,总是在真机调试这块弄的云里雾里的,什么证书,什么描述文件,bundle id什么的,测试设备没有添加到证书里面,等等一系列问题,不知道现在刚入门的朋友们还有没有这样的问题。

今天这篇文章就简单介绍一些iOS应用的签名原理,希望能帮到那些入门的朋友,针对资深的朋友,希望也能起到一定的帮助,如果有不对的地方,还希望路过的朋友多多指正。

2. 数字签名

在进入正题之前,我们先看看数字签名。

比如开发者向服务器上传了一段代码,即可执行文件,那么服务器将可执行文件做哈希运算,得到一个哈希值,然后再用服务器的私钥对哈希值进行加密(签名)。当客户端下载了这个可执行文件后,客户端首先将可执行文件做哈希运算,得到一个哈希值,然后用客户端的公钥对服务器端的签名解密,最后将解密后得到的哈希值与客户端自己算出来的哈希值进行比较,从而验证整个上传下载过程中,文件是否被修改等问题。

3. 简单代码签名

代码签名是对可执⾏⽂件或脚本进⾏数字签名。⽤来确认软件的签名未被修改或损坏的措施,和数字签名原理⼀样,只不过签名的数据是代码⽽已。

那么苹果是如何做到确保每一个安装到iOS系统上的APP都是经过苹果官方允许的呢?这里就要用到代码签名

最简单的代码签名就是通过苹果官⽅⽣成⾮对称加密的⼀对公私钥,在iOS的系统中内置⼀个公钥,而私钥由苹果后台保存,我们的APP上传到AppStore时,苹果后台⽤私钥对APP数据进⾏签名,iOS设备下载这个APP后,⽤公钥验证这个签名,若签名正确,则说明这个APP肯定是由苹果后台认证的,并且没有被修改过,保证安装的每⼀个APP都是经过苹果官⽅允许的。

这种方法确实很简单,但是并不是所有的APP都需要经过App Store这一步骤的,比如开发者真机调试,企业级的APP安装,这些是不需要上传到App Store的,那么也就不会在App Store后台通过私钥签名。 所以实际的签名并不是这么简单的,请继续往下看。

4. 双层代码签名

上面提到简单的代码签名是不能保证苹果对安装到iOS系统的APP的绝对控制权,那么既要保证绝对的控制权,又要保证系统的安全性,则需要双层代码签名。 先看看示意图: 下面针对这个示意图简单说明一下: 在整个过程中,有三个主要的角色,我们的Mac电脑,iOS设备,苹果服务器。

  1. 通过Mac电脑的钥匙串(Keychain)生成一个请求请求证书所需要的XXX.certSigningRequest文件,简称CSR(Certificate Signing Request,将这个文件保存到本地,留作后用,再创建完这个文件的同时,钥匙串(Keychain)里也生成了一对非对称加密的公钥和私钥,我们简称为公钥M和私钥M。
  2. 苹果还有一对加密的公钥和私钥,其中公钥(简称公钥A)存储在iOS设备里,私钥(简称私钥A)存储在苹果服务器。
  3. 当去开发者中心申请证书的时候,需要将之前创建的CSR文件传给苹果服务器,这个CSR文件则包含了公钥M和一些开发者的信息。苹果服务器则用私钥A对传来的公钥M进行签名,将签名结果和哈希值放到证书里面。当然了,得到证书不是我们的目的,我们最终是要得到一个叫描述文件(Provisioning Profile)的东西,这个东西里面则包含了刚刚创建的证书,AppID,设备IDs以及一些权限文件等。
  4. 在开发时,编译完⼀个 APP后,⽤本地的私钥 M(导出的P12)对这个 APP进⾏签名,同时把第三步得到的描述文件⼀起打包进 APP⾥,安装到⼿机上。
  5. 在安装时,先要判断当前设备是否包含在描述文件里面,如果包含,iOS系统取得描述文件中的证书,通过系统内置的公钥 A,去验证证书的数字签名是否正确。
  6. 验证通过后确保了公钥 M是苹果认证过的,再⽤公钥 M去验证 APP 的签名(第4步的签名),这⾥就验证了这个 APP安装⾏为是否经过苹果官⽅允许。

以上示意图及说明只是对苹果双层代码签名的一个梳理,苹果实际签名应该会比这更复杂一些。

5. 描述文件

上面已经设计到描述文件了,那描述文件具体有什么信息,又有什么用呢?请看下面这个图:

了解完描述文件主要内容后,再看看为什么要有这个东西。通过双层验证,可以确保安装到iOS设备上的APP是苹果认可的,但是苹果会允许开发者通过一个电脑给很多很多的设备安装APP吗?当然不会了。苹果为了解决这个问题,⼜加了两个限制: 第⼀限制在苹果后台注册过的设备才可以安装。 第⼆限制签名只能针对某⼀个具体的APP。 并且苹果还想控制App⾥⾯的iCloud/PUSH/后台运⾏/调试器附加这些权限,所以苹果把这些权限开关统⼀称为Entitlements(授权⽂件),并将这个⽂件放在了⼀个叫做Provisioning Profile(描述⽂件)⽂件中。

描述⽂件是在AppleDeveloper⽹站创建的,Xcode运⾏时会打包进⼊APP内. 所以我们使⽤CSR申请证书时,我们还要申请⼀个东⻄,那就是描述⽂件。

6. 结束语

本篇文章主要分析了一下iOS应⽤签名原理,希望能对各位同仁有所帮助。

由于重点在签名原理,所以文章中未涉及如何创建CSR文件,如何申请证书,创建描述文件,如果有必要,后续文章会记录这些。

最后,走过路过的朋友,如果觉得文章对您有所帮助,不要不舍得您的赞哦,如果文章有需要更正的地方,还请指出,谢谢!

原文作者:Daniel_Coder

原文地址:blog.csdn.net/guoyongming…