iOS App签名机制详解
出来混,迟早是要还的,最近搞自动化打包的时候,对签名机制以及工程结构的不了解导致解决问题时间较长,特写此文以备不时之需。
签名作用
code sign也就是代码签名这个词还是很好理解的,诗人在完成自己的作品的时候会签下自己的名字,然后再盖一个戳儿,这就是签名。在计算机世界,其实作用也是一样的。代码签名的主要作用有以下三点。
- 确保代码在签名之后没有被篡改过
- 确保代码来源的可靠性
- 控制权限的使用
我们在App Store发布应用的时候,肯定是不希望被假冒伪劣的,苹果通过签名就能保证你的App只有正品存在。
签名原理
其是原理还是比较简单的,就是数字签名,先看下苹果官网给的图。
Data是将要被签名的数据。
一般来说会先对Data取消息摘要(比如md5等),这样的话Data就会变短很多,大大降低签名的计算量。然后用私钥加密,然后就将Data和加密后的Data摘要一起发出去。然后其他人收到Data和加密后的Data摘要之后,就可以先用同样的算法计算Data的摘要,并使用公钥来解加密的Data摘要,看两者是否一样,如果一样的话,就说明没有篡改过。
其实原理就是这么简单,那图中的签发者证书是干啥用的呢?这个主要就是解决公钥的传输问题。我拿公钥来解加密后的消息摘要,但谁来保证我用的公钥是真的呢?要是我拿了个假公钥在解,那不就坑爹了么?这个时候就需要证书中心了。也很形象,从这个里面发出来的公钥,我们就认为是真的。他会公钥一样证书,说,你这个公钥在我这里是经过认证的,值得信赖。其实证书中心无非也就是对公钥再做了一次上图的过程,只不过这一次用的私钥是证书中心自己的私钥。
数字签名有些基本的概念,这里就不详述了,各位看官自行查文档吧。
- 非对称加密
- Certificate Authority(证书中心)
- Public Key(公钥)
- Private Key(私钥)
苹果签名
下面我们就将理论联系实际,看看上述原理是怎么在苹果这个签名的过程中得到体现的?
Signing Identities
xcode会在构建的时候使用sign identity来签名你的app。
signing identity包含由苹果发布的 公钥-私钥对 ,他们会被存储在keychain中。
下载signing identity之后,你的keychain中就有私钥了,因此就可以用私钥签名了。
Certificates
certificate存在你的开发者账号中,其只包含 公钥。
当你在开发者账号下创建证书之后,也就是苹果有了你的公钥,因此,苹果就可以利用该公钥保证你提交的app没有被篡改过。
Intermediate Certificate
当你安装xcode的时候,intermediate certificate就会被安装到你的keychain中。该证书即Apple’s World Wide Developer Relations(WWDR)证书,就是证书中心,用来保证你的certificates都是合法的。
苹果会利用其WWDR的私钥加密你的公钥,也就是你的证书是经过苹果签名的。
Development Certificate
开发证书用来识别team中的开发者,允许开发者签名的app可以跑在真机上。
Distribution Certificate
发布证书用来识别你的team或者组织,允许你往appstore提交应用。
Development Provisioning Profile
开发配置文件是将App ID、多个开发证书以及多个设备打包成一个配置文件
如果你想要将app开发限制在特定的组成员和设备上,就需要创建开发配置文件。
Distribution Provisioning Profile
发布配置文件是将App ID、一个发布证书打包成一个配置文件
当你需要发布app的时候,就需要创建发布配置文件。
p12
因为私钥只存在本地,所以需要对私钥进行备份,p12文件就是该备份文件。p12包含证书和私钥,因此只要安装了p12,就可以对代码进行签名了。
开发者账号的正确打开姿势
一般账号的管理是这样的:
- 公司申请公司类型开发者账号
- 公司将员工的个人苹果账号都绑定到企业开发者账号里面
企业账号和个人账号的主要区别就是企业账号有三种角色,分别是Team agent,Team admin和Team member,具体区别可见Managing Your Developer Account Team 。
公司类型的账号负责管理成员账号、发布证书、App IDs、注册开发设备等等,而加入公司账号的个人开发者就可以创建开发signing identity,配合已经加入公司账号的真机,就可以真机调试了。
但因为Xcode7开始,苹果支持个人苹果账号也支持真机调试,因此其实公司类型的开发者账号意义并不是很大了,基本已经沦为和个人开发者账号一模一样了。
因此下面我们来看开发者账号如何才能真机调试,真机调试私钥、公钥和配置信息缺一不可。
- 安装xcode,以便安装Intermediate Certificate (安装CA)
- 然后在打开xcode,在Xcode -> Preference -> Accounts添加Apple账号
- 选择Team创建signing identity,一般开发者只需要创建iOS Development类型的signing identity就可以了,这样就有了公钥和私钥对存储在keychain中 (添加私钥)
- 在开发者账号下创建证书、App ID,添加设备,并创建配置文件(.mobileprovision)
- 下载mobileprovision并双击安装(添加公钥等)
上述步骤都齐全就说明你已经具备了签名的所有条件,就可以在Xcode中真机调试了。