关于前置基础概念: 需要参考加密、签名、证书的基础概念和流程
众所周知 iOS 无论开发和发布都需要一堆的证书,那么每个证书的作用是啥呢,它是怎么生成的呢,就是本章主要了解的内容。
注:Apple 本身就是 权威 的CA证书的认证机构。
一、证书列表
开发中必须包含有以下几种证书:
- Mac上生成
CertificateSigningRequest.certSigningRequest
文件 - 上传刚刚的
.certSigningRequest
文件 生成ios_development.cer
\ios_distribution.cer
证书文件(cer证书
) - 注册device、添加App ID
- 获得
*.mobileprovision
文件 (也就是pp证书
)
二、全景大图-看全局
我们先看一张大图,然后来逐步讲解。
三、钥匙列表
主要使用到的钥匙角色有。
- Mac 的公钥、私钥
- Apple的私钥 (需要上传到苹果官网后台进行使用,个人是没有的。)
- iOS设备里面包含的 Apple的公钥
四、 .certSigningRequest 文件
这一步生成 CertificateSigningRequest.certSigningRequest
文件 就对应者Mac设备的公钥,关于私钥的位置我们不关心。
五、 cer 证书
将上一步的 .certSigningRequest
上传到Apple 官网后,Apple 会用自己的 私钥,对上传的文件(其实是Mac的公钥)进行签名,
然后得到 .cer
证书。
.cer
证书包含有 Mac的公钥+签名+Mac的相关信息等
也就是对应大图里面的 :
六、 .mobileprovision文件 (也就是pp证书
)
这一步会让我们选择 刚刚的 .cer
证书 + App ID
+ 可安装的设备
(Appsore等发布渠道没有这个选项)
然后 apple 用自己的 私钥
对其 进行签名。最终生成 pp证书
注:
App ID
里面包含有 当前 application的所有权限信息等。
也就是对应大图里面的 :
同理可以看出 pp文件包含有 cer文件的所有信息
七、 ipa 包内的文件内容
我们将 后缀为 .ipa
的文件更改 后缀为 .zip
然后进行解压。
可以看到如下结构:
有三部分组成: CodeResources + pp + 其他
- 里面的 CodeResources 文件其实就是一个 plist 文件。里面包含了当前app的其他所有文件的散列值(各种资源文件、nib、png、html、mach-o), 每个文件生成 散列值后 再用mac的公钥进行签名。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>files</key>
<dict>
<key>AppIcon20x20@2x.png</key>
<data>
4ks7eY796HDUyqe3inCSmyrYWus=
</data>
<key>AppIcon20x20@2x~ipad.png</key>
<data>
4ks7eY796HDUyqe3inCSmyrYWus=
</data>
<key>AppIcon20x20@3x.png</key>
<data>
NPu1GSfNuEUrnv4Xv66KqOijUmw=
</data>
<key>AppIcon20x20~ipad.png</key>
<data>
xaqeRlvoMr4z4838PEXoH2pg5h4=
</data>
<key>AppIcon29x29.png</key>
<data>
2bwmXULR6f8MkodULuPJdsVhi8Q=
</data>
......
- pp文件包含了,app的权限,appID, cer证书(mac 公钥)。
也就对应着大图的里面的 这个部分,代表 ipa 文件的组成部分。
八、 整个过程
我们再把第二部的大图拿过来,通读一遍。
按照图中的 1-6的步骤。
- 将所有的 app 文件 进行
hash
后 再用mac 私钥
进行加密。 生成CodeResources
文件。 - 在apple官网 把
mac的公钥
(.certSigningRequest文件)用 apple私钥
签名。 生成.cer
证书 - 将2的
.cer
证书 和 devices 、appid、app的权限,再用apple 私钥
进行签名。生成pp文件,并将pp文件一并放入ipa包里面。 - 在iOS设备上,用
apple 公钥
验证pp文件的签名。并对当前app的设备和id和权限进行逐一校对, 如果有一项不通过,则安装失败。 - 在iOS设备中,开始运行时,同样用
apple 公钥
对第4步取出的cer证书进行验证,取出Mac公钥
。 如果失败则运行失败。 - 在iOS设备中,开始运行时,用第5步的
Mac 公钥
对第1步生成CodeResources
文件进行解密,判断文件是否被篡改, 并将取出的所有文件的hash
值进行 一一核对。如果有一项不通过,则代表有问题。
备注:部分笔记包含有MJ老师的学习资料。