iOS

由浅到深理解iOS的签名机制

Posted by 易博 on June 5, 2017

一直以来,针对iOS开发者,特别是刚入行的开发者,apple的签名机制是一个理解的难点,多种证书、描述文件、证书签名请求(CSR)等等,都是一些专业名词,加上apple签名机制的复杂性,难以理出头绪。本文将由浅入深解析apple的签名机制,希望能帮助大家解惑

在这之前,首先先理解两个概念:非对称加密和数字证书

非对称加密

上面提到的签名就是数字签名,它是基于非对称加密算法实现的。对称加密算法是加密和解密内容都使用同一份密钥,而非对称加密则有两份密钥,分别是公钥和私钥,公钥对外提供,私钥自己保存。用公钥加密的数据,要用私钥才能解密,用私钥加密的数据,要用公钥才能解密。有关详细的非对称加密的解释,可以参阅百科非对称加密算法

数字签名

数字签名的意思就是我认可这个数据,然后在这个数据上盖个戳(签名),然后发给别人,别人可以知道这个数据是我认证过的,内容没有被褚篡改。一般的过程是这样的

1. 用一种摘要算法,算出数据的摘要。一般采用MD5算法。这里更正一个说法,MD5是一种摘要算法,不是加密算法,很多人把这个算法当做加密算法来用
2. 生成非对称的密钥,私钥自己保存,公钥发布出去
3. 将数据的摘要用自己的私钥加密,这里就叫做签名。然后将加密后的摘要和原始数据一起发给别人
4. 别人收到数据后,先用你的公钥解密得到摘要,然后用同样的摘要算法算出原始数据的摘要,对比两份摘要是否相等,就可以得知数据是否经过篡改

名词解释

开发者账号

可以分为以下三种:Apple Developer Program、Apple Developer Enterprise Program、iOS Developer University Program

其中,第一种包含组织类型和个人类型,可上架App Store,但是不能通过分发安装。第二种不可上架App Store,但是可以分发安装。第三种不大了解

证书(Certificates)

上面的例子中,原始数据加上加密后的摘要信息,就可以理解为证书。文件的体现为.cer文件

证书签名请求(CertificateSigningRequest)

这个文件是在本地生成密钥对(一个公钥,一个私钥)时创建。用苹果的公钥(每个Mac OS里会有),将生成的公钥以及填写的个人信息签名后生成的文件。这个文件的作用是在开发者中心向苹果申请证书(消息推送证书、开发者证书等)时需要上传,苹果用来验证开发者身份

授权文件(Provisioning Profile)

顾名思义,授权文件就是苹果授权允许你能做的事情的集合。包含了App需要用到的证书、设备、服务等信息,苹果用私钥加密,在Mac上可以用苹果的公钥解密,用于Xcode

p12

证书的另一种存在格式。如果包含本地私钥的文件,一般不要对外公开,同一个开发team可共用

苹果的签名机制

1、在Mac上申请CSR文件或者通过导入带私钥的证书(p12)之后,在本地的钥匙串中添加对应的私钥。公钥在CSR文件中

2、苹果有自己的公钥和私钥对,公钥存在于每一个苹果设备上,用于加密需要上传给苹果的数据和解密苹果发来的数据,私钥不对外公开

3、在开发者中心申请证书的时候,我们需要上传自己的公钥信息,苹果会用其私钥签名我们上传的公钥信息,然后返回给开发者,表示这个申请苹果已经通过,这个也就是证书

4、在开发者中心申请AppID,配置好设备列表(在部分设备上安装还是在所有设备都能安装)和服务(消息推送、内购、地图等),然后和上面步骤得到的证书,一起用苹果的私钥签名后得到授权文件,授权文件中含有开发者的公钥信息

5、在使用xcode时,xcode会用苹果的公钥去验证证书和授权文件,得到对应配置在xcode中展示。在打包时,会用开发者的私钥签名App

6、安装App时,系统先用苹果的公钥去验证所有文件的有效性,然后拿到授权文件中的开发者公钥去验证App的有效性,所有验证通过之后再去验证授权文件中的权限

大致的流程图如下图