必备知识架构

  1. CertificateSigningRequest:本地公钥。
  2. p12:本地私钥,可以导入到其他电脑。
  3. 证书:内容是公钥或私钥,由其他机构对其签名组成的数据包。
  4. Entitlements:包含了 App 权限开关列表。
  5. Provisioning Profile:包含了 证书 / Entitlements 等数据,并由苹果后台私钥签名的数据包。

iOS App 签名的原理

概览

四种方式安装一个APP的方式

  1. 从 AppStore 下载
  2. 开发 App 时可以直接把开发中的应用安装进手机进行调试。
  3. In-House 企业内部分发,可以直接安装企业证书签名后的 APP。
  4. AD-Hoc 相当于企业分发的限制版,限制安装设备数量,较少用。

区别:

App Store 下载的是Apple后台用私钥A对其进行重签名,

而其他的是用Xcode配置的对应该证书的本地私钥L对app进行签名。

一、App Store 下载的签名机制(最简单的签名)

当App 提交审核通过后,Apple会对App重签名,所以从App Store下载的app都是苹果的官方签名。

流程如下:

APP签名机制1

1、Apple 官方有自己固定的一对公钥和私钥,私钥A存在Apple后台,公钥A存在iOS设备

2、app审核通过后,Apple后台用私钥A对其进行重签名

3、app下载到iOS设备后,iOS设备内置的公钥A会对app的签名进行验证

4、如果验证通过,则可运行,否则不能

当然除了这个方式,还有一下三种方式安装一个app:

  1. 开发时,直接通过USB将应用安装到手机进行调试;
  2. In-House 企业内部分发,可直接安装企业证书签名的App;
  3. Ad-Hoc 相当于企业分发的限制版,限制安装设备数量。

①、KeyChain 里的“从证书颁发机构请求证书”,本地生成一对公私钥。(其中:公钥L是保存的CertificateSigningRequest(CSR),而私钥L保存在电脑本地,可以导出为p12)

附:Apple 官方也有自己固定的一对公钥和私钥,私钥A存在Apple后台,公钥A内置在iOS设备

(因为这里的这个私钥是本地Mac持有,所以团队开发时,可在KeyChain导出私钥,存为.p12文件,其他Mac即可导入这个私钥)

2、在Member Center把CertificateSigningRequest上传到苹果后台生成证书(即上传之后Apple后台用Apple 官方自己固定的私钥A对我们上传的公钥L进行签名,将得到的签名+公钥L打包起来,称为证书),下载到本地。

Apple 官方有自己固定的一对公钥和私钥,私钥A存在Apple后台,公钥A内置在iOS设备

3、在Member Center配置AppID、添加设备UUID/Entitlements, 生成app对应的 Provisioning Profile 文件,并下载到本地
4、在XCode中配置好证书,打包编译时,用Xcode配置的对应该证书的本地私钥L对app进行签名,并把 Provisioning Profile 文件一起打包进App去(文件名为 embedded.mobileprovision)。这里对App的签名数据分两部分,Mach-O 可执行文件把签名直接写进这个文件,其他资源文件则保存在_CodeSignature目录下

5、安装APP到手机上时,iOS设备内置的公钥A(指Apple官方自己固定的公钥)对embedded.mobileprovision的数字签名进行验证,同时对里面的证书的签名也会验证
如果验证通过,确保了embedded.mobileprovision的数据是苹果授权后,再取出里面数据做各种验证,包括公钥L对app签名进行验证,验证设备ID,AppID,权限开关。

iOS-常见三种加密(MD5、非对称加密,对称加密)