App 签名流程
1、在Mac系统中生成非对称加密算法的一对公钥\私钥(你的Xcode帮你代办了).这里称为公钥M 私钥M (注:M = Mac)
开发端:xcode会在keychain生成一对公钥M、私钥M,保存在mac电脑中
设备端:还有一对 公钥A(iPhone)、私钥A(苹果服务端)
Mac 公钥M 私钥M
2、苹果自己有固定的一对公私钥,跟之前App Store原理一样,私钥在苹果后台(server),公钥在每个iOS系统中(iphone).这里称为公钥A , 私钥A. A=Apple
Apple server 私钥A
Apple iphone 公钥A
step 01:通过mac中的
公钥M
(核心)+证书颁发机构信息,生成一个CSR文件,传递给苹果服务器step 02: 苹果服务器通过私钥A加密公钥M,生成一个证书,其中包含公钥M+Hash值,并对公钥M的Hash值作数字签名
私钥A 加密 公钥M
苹果服务器就相当于CA机构
证书就是 CRT文件
step 03: 通过mac中的私钥M,对App中的Mach-O进行签名,生成一个App的签名,同时将证书打包进去,形成一个ipa包
step 04: 通过iPhone的公钥A 解密 证书,证书解密后得到公钥M,公钥M 可以验证 App的签名,验证通过,说明安装行为是被允许的,合法的(但是还无法限制设备,接下来苹果的操作很骚。。)
苹果为了解决应用滥用的问题,所以苹果又加了两个限制.
第一限制在苹果后台注册过的设备才可以安装.
第二限制签名只能针对某一个具体的APP.
并且苹果还想控制App里面的iCloud/PUSH/后台运行/调试器附加这些权限,所以苹果把这些权限开关统一称为Entitlements(授权文件).并将这个文件放在了一个叫做Provisioning Profile(描述文件)
文件中.
描述文件是在AppleDevelop网站创建的(在Xcode中填上AppleID它会代办创建),Xcode运行时会打包进入APP内.所以我们使用CSR申请证书时,我们还要申请一个东西!! 就是描述文件!
在开发时,编译完一个 APP 后,用本地的私钥M对这个APP进行签名,同时把从苹果服务器得到的 Provisioning Profile 文件打包进APP里,文件名为embedded.mobileprovision,把 APP 安装到手机上.最后系统进行验证。
为了限制,苹果提供了一个权限文件,即profile - 描述文件,所以3中的证书是包含在描述文件中的。除此之外还包含 设备id、AppID、权限文件等信息,其目的有两个:1)限制免费证书安装设备;2)限制免费证书安装期限,以下是加上描述文件后的双重验证过程
总结流程
1)苹果服务器提供了一个描述文件,其中包含CRT证书。
2)然后通过mac的私钥M
对Mach-O文件进行签名,生成App签名。
3)将Mach-O文件、App签名、描述文件一起打包生成ipa包
4)将App安装到iOS设备中
5)通过iPhone手机的私钥A解密描述文件中的CRT证书,解密后得到公钥M
6)然后通过公钥M验证App的签名。因为App签名是通过私钥M进行签名的,如果验证通过,则说明安装是合法的
终端命令查看:通过命令查看描述文件(.app包的目录下):security cms -D -i embedded.mobileprovision
总 结
证书:公钥M/私钥M发出去,由官方的机构对其进行签名后组成的数据包
p12 就是本地私钥M
描述文件:包含证书、权限文件(Entitlements - 权限开关)、UUID等信息+权限。不能修改
证书生成流程:
1、通过本地的公钥M/私钥M,申请证书 -- CSR文件
2、服务器将公钥M进行一次RSA加密,得到CRT证书,
3、将CRT证书下载到本地,与私钥M(p12)进行绑定
最终流程:
1、在Mac中通过公钥M
+证书颁发机构信息生成CSR文件
2、将CSR文件传递到苹果服务器,申请CRT证书
3、苹果服务器通过私钥A
加密公钥M
,生成CRT证书,并对公钥M的hash值进行数字签名(即通过RSA加密)。同时苹果还提供了描述文件
4、通过私钥M
对Mach-O进行签名,生成一个App的签名,同时将描述文件、CRT证书等打包,形成一个ipa包
5、App安装到iOS设备
6、从iPhone手机中获取公钥A
,通过公钥A
解密CRT证书
,得到公钥M
7、通过公钥M
验证App的签名