前言
iOS App真机调试、打包都会涉及到各种证书文件 CertificateSigningRequest, *.mobileprovision,*.p12,*.cer等,这些证书文件分别是什么,当我们生成签名证书、打包,这些操作的背后原理是什么,本文就从原理出发,一步步讲述iOS App的签名原理和流程,和它为什么能保证App的安全;
签名目的
在iOS系统诞生之前,一些主流的操作系统,如windows,mac中的软件随便从哪里都可以下载安装,流氓软件,盗版软件,广告插件植入层出不穷,鉴于这些影响用户体验的原因,苹果系统有一种机制可以限制软件的安装,保证每一款app都是经过官方允许之后才能安装,因此诞生了代码“签名”;
签名原理
RSA非对称加密,RSA 算法的可靠性基础:对极大整数做因数分解是很困难的。RSA 是非对称算法,加解密使用不同的密钥。
RSA算法原理数学基础如下:
该公式中涉及到离散对数、欧拉函数、模反 等知识,可参考 RSA加密原理&密码学&HASH文中讲述;
其中 n,e为公钥,n,d为私钥,m为明文,c为秘文;d 是 e 相对于 φ(n) 的模反元素;
可以测试一下,把一下变量代入公式 m = 3 , n = 15 , φ(n) = 8 , e = 3 , d = 11;
1.假如我们要加密 m = 3 这个变量:
由此得到秘文12;
2.开始解密:
是不是得到了3 ? 也就是第一步我们加密的明文m;
- RSA加密算法概述: 两个密钥都可以用于加密,解密时需要使用另一个密钥。但是,通常用公钥加密私钥解密,因为公钥是近乎完全公开的,对于私钥加密的数据,有太多的人可以解密了。理论上 A 和 B 之间要通过 RSA 实现保密通信,需要 A 和 B 各自生成一组密钥,同时保管好自己的私钥;用对方的公钥加密要发送的消息,用自己的私钥解密对方发送过来的消息。
在签名的场景下,私钥用于签名,保证归属权,公钥用于验签,验证归属者。
真机调试场景
安装包ipa不需要传到苹果服务器,可以直接编译安装到手机上,但是苹果要对安装的ipa拥有控制权;
- 哪些ipa可以安装(防止一些未经授权的流氓软件,病毒软件,广告插件安装到手机)
- 允许安装的设备(防止未经授权审核的app绕过苹果肆意扩散)
为了实现以上需求,苹果使用了双重签名,流程如图;
1.在你的 Mac 开发机器生成一对公私钥,这里称为Mac公钥,Mac私钥。
2.苹果自己有固定的一对公私钥,私钥在苹果后台,公钥在每个iOS设备上。这里称为Apple公钥,Apple私钥。
3.把Mac公钥传到苹果后台,用苹果后台里的Apple私钥去签名Mac公钥。得到一份数据包含Mac公钥以及其签名,把这份数据称为证书。
解释:这一步对应的操作其实就是,钥匙串访问 -> 证书助理 -> 从证书颁发机构请求证书,将生成的 CertificateSigningRequest.certSigningRequest 文件传给Apple 开发者中心的后台,开发者中心生成 .cer 后缀的文件,这就是证书;
4.在苹果后台申请AppID,配置好设备ID列表和APP可使用的权限,再加上第③步的证书,组成的数据用Apple私钥签名,把数据和签名一起组成一个Provisioning Profile文件,下载到本地Mac开发机。
解释:这里简单说一下,当我们生成 Provisioning Profile 文件时,生成步骤需要关联 Appid,而Appid中又关联了Certificates、Devices设备列表,这样一份Provisioning Profile文件就包含了验证信息和可允许安装设备的全部内容
5.在开发时,编译完一个APP后,用本地的Mac私钥对这个APP进行签名,同时把第④步得到的Provisioning Profile文件打包进APP里,文件名为embedded.mobileprovision,把APP安装到手机上。
6.7.安装时,通过系统内置的Apple公钥,去验证 embedded.mobileprovision的数字签名是否正确,里面的证书签名也会再验一遍。
8.确保了embedded.mobileprovision里的数据都是苹果授权以后,就可以取出里面的数据,做各种验证,包括用Mac公钥验证APP签名,验证设备ID是否在ID列表上,AppID是否对应得上,权限开关是否跟APP里的Entitlements对应等。
其它打包方式
当使用发布模式打包,mobileprovision中只是少了Devices,因为发布版没有设备限制,如图:
其它
如果其他开发者想用你生成的证书真机调试或者打包app的话,需要你把Mac私钥发给他,也就是在“钥匙串访问”里面,导出p12文件发给对方,对方用你发给他的Mac私钥去签名app,这样他才能连接真机调试或打包;