1、签名机制
1.1、非对称加密
非对称加密分为公钥和私钥,用一方加密后需用令一方解密。正常情况下,公钥可以对外公开,而私钥需私密保存
- 常用
公钥加密,私钥解密的方式来进行加密防止数据明文传输 - 常用
私钥加密,公钥解密的方式来签名确保数据的完整性防止被篡改
1.2、数字摘要
将 任意长度的源文本 通过Hash函数计算得到一串固定长度的文本,要保证不同源文本计算得到的值各不相同,且不能被反推得到源文本。常用的Hash算法有MD5和SHA
1.3、数字签名
又称 公钥数字签名,是非对称加密与数字摘要的结合,用于验证数据的完整性及不可抵赖性
- 发送方用
接收方的公钥对数字摘要进行加密,再和报文(通过报文也能算出摘要)一起发送 - 接收方接收后用相同的Hash算法
对报文进行摘要计算 - 用
私钥解密得到发送方的摘要,如果通过报文计算的与解密的两个摘要相同,则接收方就能确认该 报文是对方发出的且未被篡改
2、iOS签名机制
2.1、iOS签名机制的作用
iOS签名机制的作用就是保证安装到用户手机上的App都是经过Apple官方允许的。当然,越狱设备除外。 在平时开发时,不管是真机调试,还是发布App到App Store,我们都需要经过以下几个步骤:
- 首先,在Mac上生成CertificateSigningRequest.certSigningRequest文件
- 然后在Apple开发者网站上获取到ios_development.cer或者ios_distribution.cer证书文件,前者是开发证书,后者是发布证书
- 在Apple开发者网站上注册device,添加App ID
- 选择device、App ID以及开发证书或者生产证书,生成mobileprovision文件
经过以上的一系列操作之后,我们最终就可以拿到ios_development.cer或者ios_distribution.cer证书文件,以及mobileprovision描述文件。通过安装这些文件到Mac上就可以进行真机调试。当然,如果你在Xcode中勾选了Automatically manage signing选项,那么Xcode会自动帮我们执行以上的所有操作
那么,以上操作每一步执行的作用是什么?最后获得的ios_development.cer或者ios_distribution.cer证书文件,以及mobileprovision描述文件的作用又是什么?这些文件中又包含了什么内容?
2.2、iOS签名流程
要想知道上述所有文件的具体作用,就需要了解iOS签名的完整流程。在使用Xcode编译、运行完项目之后,Xcode其实帮我们做了签名操作。可以通过查看xcode的build信息
- 其实就是利用
codeSign指令对.app文件进行签名操作 - 想要执行iOS签名流程,就需要有以下公钥、私钥信息
Mac设备的公钥和私钥,一般是Mac设备自己生成Apple官方的私钥,保存在Apple的后台Apple官方的公钥,每一台iPhone出厂之后都会保存Apple官方的公钥信息
2.3、签名流程分析
iOS项目在编译完成之后会生成.app文件,App的签名操作从拿到.app文件开始
-
拿到.app文件之后,
使用 Mac私钥 对 .app文件 进行签名,生成的签名文件存放在.app目录下的_CodeSignature/CodeResources -
使用
Apple私钥 对 Mac公钥 进行签名,生成证书文件 -
将第2步获取到的证书文件和 devices、app id 以及 entitlement 一起
使用Apple私钥再次进行签名,生成mobileprovision文件,也就是描述文件 -
将第1步签名过后的 .app文件 和第3步生成的 mobileprovision文件 一起压缩
生成ipa安装包 -
完整的签名打包过程如下
2.4、验证流程
对.app安装包进行签名之后,压缩生成ipa安装包,然后将ipa安装包安装到iPhone上时,会进行签名验证操作
-
使用iPhone上存放的
Apple公钥 验证 mobileprovision文件 中的签名 -
签名验证成功之后,拿到 mobileprovision 中存放的 devices、app id以及entitlement信息,同时拿到证书文件
-
然后
使用 Apple公钥 对证书中的签名进行验证,验证成功之后拿到 Mac公钥 -
拿到Mac公钥之后,
使用 Mac公钥 对 App的签名文件 进行验证,如果验证成功,则表明当前的App的源码没有被篡改过,然后此App就能安装到iPhone上 -
最后得到完整的签名加验证流程,如下:
注解
在文件mobileprovision中,有devices、app id以及entitlement信息,它们的作用分别是:
- devices标识着哪些设备可以安装此App,如果设备不在devices中,安装会失败
- app id,指定此标识的App才能安装,如果App的唯一标识和此app id不对应,则安装失败
- entitlement中存放在App所具备的权限信息,如果App所使用的权限和entitlement中存放的权限不一致,也会产生问题
| 名称 | 作用 |
|---|---|
| 证书(cer) | 内容是公钥或私钥,由其他机构对其签名组成的数据包。 |
| Entitlements | 包含了 App 权限开关列表。 |
| CertificateSigningRequest | 本地公钥。 |
| p12 | 本地私钥,可以导入到其他电脑。 |
| Provisioning Profile | 包含了 证书 / Entitlements 等数据,并由苹果后台私钥签名的数据包。 |
3、签名实际操作流程
我们来一步步的执行实际的操作来对我们所学的签名流程进行验证。同时了解 ios_development.cer 或者 ios_distribution.cer 证书文件,以及 mobileprovision 等文件的实际作用
-
在Mac上生成 CertificateSigningRequest.certSigningRequest 文件。其实这个文件就是Mac设备的公钥
-
登录Apple开发者网站,获取证书,安装到Mac设备。此步骤就是
利用Apple的私钥 对 Mac公钥 进行签名,生成 证书文件 ios_development.cer 和 ios_distribution.cer -
生成mobileprovision。此步骤就是将 devices、app id、entitlement 和 证书文件,通过
Apple私钥进行签名,生成最后的mobileprovision文件。而且生成的mobileprovision文件就决定了当前App可以安装的设备有哪些,可以安装的App的BundleId,以及App所拥有的权限
4、Apple官方验证流程
4.1、Apple官方验证流程如下:
4.2、AppStore签名
将App提交审核后,苹果会用官方的私钥对我们提交的App重签名,用户下载到手机后,iOS设备内置的公钥会对App进行验证,验证成功即可正常使用
所以App上传到AppStore后,就跟我们本地的证书/Provisioning Profile 都没有关系了,无论是否过期或被废除,都不会影响 AppStore 上的安装包