从事iOS开发将近两年了,日常的精力主要放在公司的业务上,最近决定开始写一些技术方面的东西,记录自己今后的学习历程,也希望和爱好移动开发的朋友多多交流学习。
下面切入正题,以前对iOS的签名机制不太了解,只知道配置个开发者证书用于调试和打个企业包什么的,遂花了点时间去学习一下iOS的打包签名机制,由于初学,本文的不足或是错误之处,还望多多批评指教。
一、非对称算法和数字签名
区别之前的对称加密算法(加密解密用的是同一个秘钥),非对称加密算法需要两个秘钥,即公钥和私钥来进行加密和解密,它俩是成对出现的,如果用公钥加密的内容,只有对应的私钥才能解密,反之,用私钥加密的内容,只有对应的公钥才能解密。相对于对称算法,该算法安全性高,只要私钥不泄露,就能保证通信双方的安全,缺点是加密和解密花费时间长。例如HTTPS协议在SSL层就用到了非对称算法。
数字签名是一种对数字内容进行校验的方法,它首先对内容使用摘要算法(例如MD5算法)生成一段固定长度的文本,可以理解为原内容的摘要,然后利用私钥加密摘要,得到原内容的数字签名。接受方同时接收到与原内容和数字签名,首先用相同的摘要算法生成原内容的摘要(摘要1), 同时用公钥解密数字签名,得到摘要2,然后比较摘要1和摘要2,若相同,则验证原内容有效。具体流程如图1.1:
二、申请数字证书
数字证书是苹果公司数字签名后的数字化证书,是iOS系统校验App的核心。以下是数字证书的申请过程:
1、开发者首先在keyChain中生成一个证书申请文件(CertificationSigningRequest,简称CSR),该文件包含开发者的信息、公钥、公钥加密算法和摘要算法,在这个过程中,首先会产生一个开发者使用的私钥,保存在keyChain中。
2、开发者上传CSR文件给Apple的MemberCenter(简称MC),苹果公司会根据该文件生成一个证书,包含两部分,即证书的内容和一段Apple的数字签名,如下图:
数字签名是苹果利用自己的私钥加密证书内容摘要得到的,是为了验证证书的有效性。iOS系统本身装有苹果公司的公钥,并通过图1.1的方式进行校验,如果摘要一致,证明数字证书的有效。苹果提供的证书有开发、调试证书,企业版发布证书,上架和AddHoc证书,类型不同,功能亦不相同。如果是团队开发,可以将证书导出生成.p12文件给其他人安装。
三、描述文件(mobileprovision)
描述文件也是通过苹果的MC下载得到,里面包含了证书、AppId和设备UDID,除了这些还有授权信息,规定了App能够使用的服务有哪些。
四、App打包签名、校验
Xcode在打包生成ipa文件的过程中,利用当前证书的私钥进行代码、资源文件的数字签名,并且将其存放在ipa文件夹的_CodeSignature文件夹下,图1.3是ipa文件的结构图。当App安装到iOS系统上时,系统首先通过描述文件找到数字证书,通过证书里的苹果数字签名,验证证书的有效性,如果证书有效,取出证书中的开发者公钥,解密App的数字签名,如果发现摘要一致,则验证通过,App成功安装在手机上,其中一个环节有问题,验证工作就失败,图1.4是校验过程。
五、相关参考