iOS 签名机制包括各种证书:Provisioning Ptofile 、entitlements、CertificateSigningRequest、p12、AppID等。
★本文介绍一些iOS App 签名的原理和流程,希望对您有所帮助!
一、签名机制为了做什么
iOS出来之前,是没有签名的,导致平台对第三方软件难以控制,盗版流行。苹果希望解决这个问题,在iOS平台对第三方APP有绝对的控制权,保证安装到iOS上的APP都是经过苹果官方允许的,怎么保证?? 就是通过签名机制。
二、什么是签名(非对称加密RSA)
通常我们说的签名就是数字签名,它是基于非对称加密算法实现。对称加密是通过同一份密钥加密和解密数据,而非对称加密则有两份密钥,分别是公钥和私钥,用公钥加密数据,要用私钥才能解密,用私钥加密的数据,要用公钥才能解密,这里不再累赘RSA,如果有感兴趣的同学可以看一看(RSA原理一、RSA原理二)。
数字签名的作用是我对某一份数据打个标记,表示我认可了这份数据(签个名),然后我发送给其他人,其他人可以知道这份数据是经过我认证的,数据没有被篡改过。
有了上述非对称加密算法,就可以实现
这里用MD5加密原因:
1、若原始数据有任何变化,计算出的摘要值都会变化。(不可逆)
2、摘要要够短。(MD5加密后得到固定长度(32字符)的字符串) (你问我为什么要够短?请转看RSA原理!)
三、通过签名,保证安装到iOS上的APP 都是经过苹果认证允许的
最直接的方式:苹果官方生成一对公私钥,在iOS里内置一个公钥,私钥由苹果后台保存,我们上传APP上AppsStore时,苹果后台用私钥对APP数据进行签名,iOS安装时,就会用公钥进行校验其是否是经过苹果官方认证允许的。
如果我们只是从AppStore上下载这一种方式的话,那这件事就over了,But我们还有三种方式安装一个APP:
1、开发APP时可以直接把开发的应用安装进手机调试。
2、In-House 企业内部分发,可以直接安装企业证书签名后的APP。
3、AD-Hoc 相当于企业分发的限制版,限制安装的设备数量,较少用。
四、其他三种方式安装方式签名
1、开发时安装,两个需求
①安装包不需要传到苹果服务器,可以直接在手机上安装。
②苹果必须对这里的安装有控制权。(经过苹果认证、不能被滥用导致非开发APP也能安装)
苹果这里用的是双层签名,流程如下
注释:③ 把公钥L 传到苹果后台,用苹果后台里的私钥A 去签名公钥L 。得到一份数据包包含公钥L 以及其签名,把这份数据包成为证书。
上面只解决了苹果认证,避免滥用该怎么解决呢??
苹果再加两个限制:
①限制再苹果后台注册过的设备才可以安装。
②限制签名只能针对某一个具体的APP。
在上诉的第三步(苹果用私钥 签名本地公钥L),还可以增加上无线多数据,这些数据都可以保证是经过苹果官方认证的,不会被篡改。
到这里证书已经很复杂了,实际上除了设备ID / AppID,还有其他信息也需要苹果签名(APP里的iCloud / push / 后台运行等权限苹果都想控制),苹果把这些权限开关统一称作Entitlements,它也需要通过签名去授权。
我们把上面的各种额外的信息都塞到证书里不太好,所以苹果另外搞了一个东西(Provisioning Profile),它包含了证书以及上述提到的所有额外信息,以及所以信息的签名。
所以整个流程稍微变了下
注释:
④把苹果后台申请的AppID、配置好的设备ID列表、APP可使用的权限和第③步的证书组成数据用私钥A 签名,然后把数据和签名一起组成一个Provisioning Profile文件下载到Mac开发机
⑤开发时,编译完一个APP后,用本地的私钥L 对这个APP进行签名,同时把第④步得到的Provisioning Profile文件打包进APP里,文件名为embedded.mobileprovision。
⑥在安装时,iOS系统取得证书,通过系统内置的公钥A 去验证embedded.mobileprovision的数字签名是否正确,里面的证书签名也会验证一边。
⑦确保了embedded.mobileprovision里的数据是苹果认证过的,就取出里面的数据,进行后续的设备ID是否在ID列表上,AppID是否对应上,权限开关是否跟APP里的Entitlements对应等。
2、另外两种安装方式:In-House 和 AD-Hoc
流程也差不多,只是企业签名不限制安装的设备数,用户安装到iOS上需要手动点击信任这个企业。
五、AppStore签名验证有点不一样
前面说到最简单的签名方式,苹果后台签名APP就可以了,实际上,苹果也是这样做的,如果过下载一个AppStore的安装包,会发现里面没有embedded.mobileprovision文件,也就是说它安装和启动流程不依赖这个文件。
据说上传到AppStore的包,苹果会重新对内容加密,原来的本地私钥签名就没用了,需要重新签名,从AppStore下载的包,苹果也不打算控制它的有效期,不需要内置一个embedded.mobileprovision去校验,直接在苹果后台的私钥重新签名,iOS安装时用本地公钥验证APP签名就可以了。
所以上传到AppStore后,就跟你的证书 / Provisioning Profile 都没关系了,无论他们是否过期或废除,都不影响AppStore上的安装包。