应用签名我们从三个方面来进行讲解
1. 代码签名
2. 双层代码签名
3. 描述文件
一 代码签名
代码签名是对可执行文件或脚本进行数字签名,用来确认软件在签名后未被修改或损坏的措施。和数字签名原理一样,只不过签名的数据是代码而已。
我们先假设一下:苹果官方希望保证每一个安装到iOS上的APP都是经过他们允许的,他们会这样做,苹果官方生成一对非对称的公私钥,在iOS系统中内置一个公钥,私钥保留在苹果后台,我们传APP到AppStore时,苹果后台用私钥对APP数据进行签名,iOS下载这个APP时用公钥进行解密,验证签名,弱解密成功,这个肯定就是由苹果后台认证的,并且没有被修改过,也就达到了苹果的需求,每一个APP都是经过苹果官方允许的。可是
此种简单的代码签名方式,如果苹果的软件下载只有一个appStore渠道下载,那么代码签名就能保证应用安全了,可是唯一下载渠道是不可能的。就比如对于我们开发者iOSER而言,我们需要在开发APP时进行真机调试,而且苹果还开放了企业内部分发的渠道,企业证书签名的APP也是需要顺利安装的,这就导致简单的代码签名是无法满足要求的。
我们再来分析一下苹果的需求
1安装包不需要上传到AppStore,可以直接安装到手机上
2 苹果为了保证系统的安全性,又必须对安装的APP有绝对的控制权(经过苹果允许的才能安装,不能被滥用导致非开发APP也能被安装)
为了实现这些需求,iOS签名的复杂度就开始增加了,苹果在这里给的方案是双层代码签名。
二 双层代码签名
首先我们来看一张图
这张图可以看到双层代码签名的整个过程,下面我们来分析一下这张图
Mac电脑 :我们自己开发用的电脑
苹果服务器: 苹果开发者中心
iPhone : 我们开发用的手机
1 首先我们的开发用的电脑mac系统中生成非对称加密算法的一对公钥/私钥(我们的Xcode帮忙办了),在图上我们成为公钥M和私钥M
2 苹果自己有固定的一对公司钥,上文已经说过了,私钥在苹果后台,公钥在iOS系统的手机上,在这里我们在苹果服务器上的成为私钥A,iPhone手机上成为公钥A。
3 把公钥M以及一些你的开发者信息传到苹果后台(我们申请的CSR文件),苹果后台用私钥A去签名公钥M以及其他开发者数据,这样得到了一份数据包含了公钥M以及其签名,这份数据我们称为开发证书。
4 在开发时,编译完一个APP后,用本地的私钥M(也就是我们常说的P12文件)对这个APP进行签名,同时将前面得到的开发证书一起打包进APP里,安装到手机上。
5 在安装时,iOS系统取到这个开发证书,通过内置的公钥A来解密验证数字签名是否正确。
6 验证证书后确保了私钥M是苹果认证的,再用开发证书中解密后获取到的公钥M去解密验证APP签名,这样就间接的验证了安装行为是否是经过苹果官方允许的(这里只验证了安装行为,不验证APP是否被改动,是因为在开发阶段,APP代码内容是不断被更改的)。
上面的过程,已经可以保证开发者的认证和程序的安全性了,但是,细心的朋友会发现,这样的过程进行下去的话,会出现只要有了开发证书,那就能安装到所有的iPhone手机上了。不着急,接着看上图中的描述文件,上面的过程我们还没有提到过,现在我们来说下这个描述文件。
三 描述文件
描述文件(Provisioning profile)一般包括三样东西:证书、App ID、设备。当我们在真机运行或者打包一个项目的时候,证书用来证明我们程序的安全性和合法性。AppID和设备证明这个APP是可以安装在这台iPhone设备上的。
苹果为了解决应用滥用的问题,所以苹果又加了两个限制.
第一限制在苹果后台注册过的设备才可以安装.
第二限制签名只能针对某一个具体的APP.
并且苹果还想控制App里面的iCloud/PUSH/后台运行/调试器附加这些权限,所以苹果把这些权限开关统一称为Entitlements(授权文件).并将这个文件放在了一个叫做Provisioning Profile(描述文件)文件中.
描述文件是在AppleDevelop网站创建的(在Xcode中填上AppleID它会代办创建),Xcode运行时会打包进入APP内.所以我们使用CSR申请证书时,我们还要申请一个东西!! 就是描述文件!
在开发时,编译完一个 APP 后,用本地的私����钥M对这个APP进行签名,同时把从苹果服务器得到的 Provisioning Profile 文件打包进APP里,文件名为embedded.mobileprovision,把 APP 安装到手机上.最后系统进行验证。通过描述文件里的信息就可以判断这个APP是否可以安装在这台iPhone设备上。
总结:结合上面所描述的,我们现在就可以明确在开发时申请的一系列正书到底是什么,有什么作用,理解后我们就可以装逼啦,下篇文章我们讲解应用的重签名。我们就可以安装我们想要的APP咯。