iOS 应用签名

2,660 阅读4分钟

在iOS系统出来之前,我们的主流操作系统(Mac/Windows)上任何地方下载的软件都能运行,系统安全存在隐患,那么苹果希望解决这样的问题,要保证每一个安装到 iOS 上的APP都是经过苹果官方允许的,所以就有了iOS的应用签名。

1、什么是应用签名?

顾名思义,应用签名就是对应用的签名,对应用中可执行文件或脚本数据(其实就是代码)进行一次Hash,然后再进行一次RSA加密后获得的结果。这就是苹果用来确认软件在签名后未被修改或损坏的措施。

2、苹果是如果验证应用签名的?

苹果给了用户一个基本的验证方式,在iOS系统中内置一个公钥,私钥由苹果后台服务器保存,当开发者将开发的App上传到AppStore的时候,苹果用暴力且直接的方式用服务器的私钥进行签名(这就是平常我们看到我们上传到AppStoreApp显示处理中的原因),用户从手机上的AppStore下载应用后,iOS系统使用公钥验证这个签名是否正确,如果签名正确,说明这个App是由苹果后台认证且没有修改过的,这样就保证了每一个App都是经过苹果官方允许的。

3、上述签名方式有什么问题?

如果我们iOS设备安装App只从App Store这一个入口这件事就简单解决了,但是开发者肯定需要进行真机调试,还有企业内部分发的渠道,那这些就不能解决了。

4、苹果的双层签名方式

对于开发者来说 安装包不需要上传到App Store,可以直接安装到手机上,但是苹果又为了保证系统的安全性,必须对安装的APP有绝对的控制权,不能被滥用导致非开发APP也能被安装。

为了实现这些需求,iOS签名的复杂度也就开始增加了,苹果这里给出的方案是双层签名。

我们需要将我们开发阶段的App安装到手机上时,苹果就给开发这提供了申请证书的方式。

双层签名.png

我们的Mac电脑上生成一对公钥M私钥M,然后将公钥M打包成CSR文件上传到苹果服务器,苹果服务器使用保存在服务器上的私钥A公钥M进行非对称加密后就会得到一个开发者证书,证书中包含的是被加密的公钥M,这个证书也就是我们常说的p12文件。

在开发阶段我们想把App安装到手机上,在Build的时候,Mac就会使用私钥MApp进行一次签名,然后把我们从苹果服务器请求回来的证书一起打包到我们的App中,这时候iOS操作系统就会使用公钥A对打包到App的证书进行解密,如果验证成功了说明是苹果允许安装的。

然后使用公钥A对证书中加密的公钥M进行解密,验证当前App的签名,这样就完成苹果的双层验证,既能保证了是苹果允许安装的,还能验证是不是我们开发的App

5、描述文件的产生

苹果为了保证安装的设备是苹果允许的的设备和限制安装的设备数,在向苹果申请证书的时候,苹果会返回一个包含证书的描述文件。

在我们开发的时候Xcode会向苹果申请描述文件。

Xcode申请描述文件

可以使用Finder 的前往打开,文件存放位置 ~/资源库/MobileDevice/Provisioning Profiles/

描述文件的位置

描述文件中会有证书的信息,授权设备的信息,申请的时间,过期的时间等等。

我们看一下这个证书,终端进入当前证书的文件夹,输入指令security cms -Di embedded.mobileprovision ,我们发现描述文件其实就是一个plist

以上是就是iOS应用签名和应用签名的验证。