iOS-签名

508 阅读6分钟

1、签名机制

1.1、非对称加密

非对称加密分为公钥私钥,用一方加密后需用令一方解密。正常情况下,公钥可以对外公开,而私钥需私密保存

  • 常用公钥加密,私钥解密的方式来进行加密防止数据明文传输
  • 常用私钥加密,公钥解密的方式来签名确保数据的完整性防止被篡改

1.2、数字摘要

任意长度的源文本 通过Hash函数计算得到一串固定长度的文本,要保证不同源文本计算得到的值各不相同,且不能被反推得到源文本。常用的Hash算法有MD5和SHA

1.3、数字签名

又称 公钥数字签名,是非对称加密与数字摘要的结合,用于验证数据的完整性及不可抵赖性

  1. 发送方用接收方的公钥 对数字摘要进行加密,再和报文(通过报文也能算出摘要)一起发送
  2. 接收方接收后用相同的Hash算法对报文进行摘要计算
  3. 私钥解密得到发送方的摘要,如果通过报文计算的与解密的两个摘要相同,则接收方就能确认该 报文是对方发出的且未被篡改

2、iOS签名机制

2.1、iOS签名机制的作用

iOS签名机制的作用就是保证安装到用户手机上的App都是经过Apple官方允许的。当然,越狱设备除外。 在平时开发时,不管是真机调试,还是发布App到App Store,我们都需要经过以下几个步骤:

  1. 首先,在Mac上生成CertificateSigningRequest.certSigningRequest文件
  2. 然后在Apple开发者网站上获取到ios_development.cer或者ios_distribution.cer证书文件,前者是开发证书,后者是发布证书
  3. 在Apple开发者网站上注册device,添加App ID
  4. 选择device、App ID以及开发证书或者生产证书,生成mobileprovision文件

经过以上的一系列操作之后,我们最终就可以拿到ios_development.cer或者ios_distribution.cer证书文件,以及mobileprovision描述文件。通过安装这些文件到Mac上就可以进行真机调试。当然,如果你在Xcode中勾选了Automatically manage signing选项,那么Xcode会自动帮我们执行以上的所有操作

那么,以上操作每一步执行的作用是什么?最后获得的ios_development.cer或者ios_distribution.cer证书文件,以及mobileprovision描述文件的作用又是什么?这些文件中又包含了什么内容?

2.2、iOS签名流程

要想知道上述所有文件的具体作用,就需要了解iOS签名的完整流程。在使用Xcode编译、运行完项目之后,Xcode其实帮我们做了签名操作。可以通过查看xcode的build信息

  • 其实就是利用codeSign指令.app文件进行签名操作
  • 想要执行iOS签名流程,就需要有以下公钥、私钥信息
    • Mac设备的公钥和私钥,一般是Mac设备自己生成
    • Apple官方的私钥,保存在Apple的后台
    • Apple官方的公钥,每一台iPhone出厂之后都会保存Apple官方的公钥信息

2.3、签名流程分析

iOS项目在编译完成之后会生成.app文件,App的签名操作从拿到.app文件开始

  1. 拿到.app文件之后,使用 Mac私钥 对 .app文件 进行签名,生成的签名文件存放在.app目录下的_CodeSignature/CodeResources

  2. 使用Apple私钥 对 Mac公钥 进行签名生成证书文件

  3. 将第2步获取到的证书文件和 devicesapp id 以及 entitlement 一起使用Apple私钥再次进行签名生成mobileprovision文件,也就是描述文件

  4. 将第1步签名过后的 .app文件 和第3步生成的 mobileprovision文件 一起压缩生成ipa安装包

  5. 完整的签名打包过程如下

2.4、验证流程

对.app安装包进行签名之后,压缩生成ipa安装包,然后将ipa安装包安装到iPhone上时,会进行签名验证操作

  1. 使用iPhone上存放的Apple公钥 验证 mobileprovision文件 中的签名

  2. 签名验证成功之后,拿到 mobileprovision 中存放的 devices、app id以及entitlement信息同时拿到证书文件

  3. 然后使用 Apple公钥 对证书中的签名进行验证,验证成功之后拿到 Mac公钥

  4. 拿到Mac公钥之后,使用 Mac公钥 对 App的签名文件 进行验证,如果验证成功,则表明当前的App的源码没有被篡改过,然后此App就能安装到iPhone上

  5. 最后得到完整的签名加验证流程,如下:

注解

在文件mobileprovision中,有devices、app id以及entitlement信息,它们的作用分别是:

  • devices标识着哪些设备可以安装此App,如果设备不在devices中,安装会失败
  • app id,指定此标识的App才能安装,如果App的唯一标识和此app id不对应,则安装失败
  • entitlement中存放在App所具备的权限信息,如果App所使用的权限和entitlement中存放的权限不一致,也会产生问题
名称作用
证书(cer)内容是公钥或私钥,由其他机构对其签名组成的数据包。
Entitlements包含了 App 权限开关列表。
CertificateSigningRequest本地公钥。
p12本地私钥,可以导入到其他电脑。
Provisioning Profile包含了 证书 / Entitlements 等数据,并由苹果后台私钥签名的数据包。

3、签名实际操作流程

我们来一步步的执行实际的操作来对我们所学的签名流程进行验证。同时了解 ios_development.cer 或者 ios_distribution.cer 证书文件,以及 mobileprovision 等文件的实际作用

  1. 在Mac上生成 CertificateSigningRequest.certSigningRequest 文件。其实这个文件就是Mac设备的公钥

  2. 登录Apple开发者网站,获取证书,安装到Mac设备。此步骤就是利用Apple的私钥 对 Mac公钥 进行签名,生成 证书文件 ios_development.cer 和 ios_distribution.cer

  3. 生成mobileprovision。此步骤就是将 devices、app id、entitlement 和 证书文件,通过 Apple私钥 进行签名,生成最后的mobileprovision文件。而且生成的mobileprovision文件就决定了当前App可以安装的设备有哪些,可以安装的App的BundleId,以及App所拥有的权限

4、Apple官方验证流程

4.1、Apple官方验证流程如下:

4.2、AppStore签名

将App提交审核后,苹果会用官方的私钥对我们提交的App重签名,用户下载到手机后,iOS设备内置的公钥会对App进行验证,验证成功即可正常使用
所以App上传到AppStore后,就跟我们本地的证书/Provisioning Profile 都没有关系了,无论是否过期或被废除,都不会影响 AppStore 上的安装包