出来混,迟早是要还的,最近搞自动化打包的时候,对签名机制以及工程结构的不了解导致解决问题时间较长,特写此文以备不时之需。

签名作用

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,就可以对代码进行签名了。 p12导出方法

开发者账号的正确打开姿势

一般账号的管理是这样的:

  1. 公司申请公司类型开发者账号
  2. 公司将员工的个人苹果账号都绑定到企业开发者账号里面

企业账号和个人账号的主要区别就是企业账号有三种角色,分别是Team agent,Team admin和Team member,具体区别可见Managing Your Developer Account Team

公司类型的账号负责管理成员账号、发布证书、App IDs、注册开发设备等等,而加入公司账号的个人开发者就可以创建开发signing identity,配合已经加入公司账号的真机,就可以真机调试了。

但因为Xcode7开始,苹果支持个人苹果账号也支持真机调试,因此其实公司类型的开发者账号意义并不是很大了,基本已经沦为和个人开发者账号一模一样了。

因此下面我们来看开发者账号如何才能真机调试,真机调试私钥、公钥和配置信息缺一不可。

  1. 安装xcode,以便安装Intermediate Certificate (安装CA)
  2. 然后在打开xcode,在Xcode -> Preference -> Accounts添加Apple账号
  3. 选择Team创建signing identity,一般开发者只需要创建iOS Development类型的signing identity就可以了,这样就有了公钥和私钥对存储在keychain中 (添加私钥) signing identity创建页面
  4. 在开发者账号下创建证书、App ID,添加设备,并创建配置文件(.mobileprovision) 配置文件创建界面
  5. 下载mobileprovision并双击安装(添加公钥等)

上述步骤都齐全就说明你已经具备了签名的所有条件,就可以在Xcode中真机调试了。

参考文献