我们在iOS开发中经常会干的一件事就是给程序打包,在打包的时候通常我们要选择对应的描述文件,证书才能保证打出的包能够在设备中安装。那苹果是怎么根据证书,描述文件来确定这个app是否可以被安装,以及证书和描述文件到底是什么那?下面我们就来了解下苹果的证书和签名机制。
非对称加密,摘要算法
在开始了解签名机制之前,先来了解几个概念。非对称加密和摘要算法。
非对称加密(RSA)是指加密密钥和解密密钥是不同的并且是成对出现的加密方式。一般是私钥加密,公钥解密。私钥由发行方保管,公钥公开给大众,从而实现让用户在使用自己发布的信息的时候,保证是没被篡改过的。非对称加密极难反推,也即很难通过公钥推算出私钥,所以只要掌握私钥不泄漏,基本就可以保证数据的安全性。
在信息发送的时候,用私钥对明文进行加密,在接收端有公钥进行解密。弊端是数据加密过于耗时,我们要知道的只是这段数据有没有被篡改,而不需要知道数据到底是什么,所以如果可以提取数据的一部分特征或者将数据通过计算产生一个固定长度的数据之后,再进行加密就会方便许多。这就是要介绍的摘要算法,摘要算法是指可以将任意长度的文本,通过一个算法,得到一个固定长度的文本。
数字签名和数字证书
数字签名其实就是非对称加密和摘要算法的结合,利用摘要算法对原文计算摘要并对摘要进行加密,就可以防止数据被篡改,也可以保证数据是由指定的机构发出。
数字证书其实就是通过数字签名实现的数字化的证书,在一般的证书组成中还添加了其他信息,如过期时间等等。
打包安装的流程
了解了证书和签名是怎么一回事之后,就可以回到iOS开发上,在打出来的ipa包里包含的文件见下图:
ipa包里主要包含,资源文件,可执行文件,以及签名目录和embedded.mobileprovision文件。
打包的过程如下:
1.向苹果后台申请一个证书,这个证书由苹果的私钥进行签名之后下载的本地,在本地钥匙串可以看到是一对的,包含公钥和私钥,打包的时候,使用本地私钥对代码进行签名。
2.在苹果后台申请一个Provisioning Profile文件,该文件包含bundleId,设备列表,和用来签名的证书,把这些信息放在一起再用苹果的私钥进行签名并最终生成一个Provisioning Profile文件。
3.在xcode中配置对应的证书和Provisioning Profile,打包时xcode会自行验证证书和文件的合法性,然后在打包进ipa中,Provisioning Profile会被重命名为embedded.mobileprovision。
4.在安装时,iOS取得系统公钥验证embedded.mobileprovision的数字签名是否正确,文件中包含的证书也会被验证。
5.系统验证之后,取得必要信息APP ID设备列表等进行比对,同时使用刚才验证过的证书里的公钥验证app签名。
其他
In-House 企业签名和 AD-Hoc 流程也是差不多的,只是企业签名不限制安装的设备数,另外需要用户在 iOS 系统设置上手动点击信任这个企业才能通过验证。上传到 AppStore 的包苹果会重新对内容加密,所以 App 上传到 AppStore 后,就跟你的 证书 / Provisioning Profile 都没有关系了,无论他们是否过期或被废除,都不会影响 AppStore 上的安装包。
Refer:
http://blog.cnbang.net/tech/3386/
http://www.pchou.info/ios/2015/12/14/ios-certification-and-code-sign.html