iOS 签名认证机制回顾与解析

关于前置基础概念: 需要参考加密、签名、证书的基础概念和流程

众所周知 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的步骤。

  1. 将所有的 app 文件 进行hash后 再用mac 私钥进行加密。 生成 CodeResources文件。
  2. 在apple官网 把mac的公钥(.certSigningRequest文件)用 apple 私钥签名。 生成.cer 证书
  3. 将2的.cer证书 和 devices 、appid、app的权限,再用apple 私钥进行签名。生成pp文件,并将pp文件一并放入ipa包里面。
  4. 在iOS设备上,用apple 公钥验证pp文件的签名。并对当前app的设备和id和权限进行逐一校对, 如果有一项不通过,则安装失败。
  5. 在iOS设备中,开始运行时,同样用apple 公钥对第4步取出的cer证书进行验证,取出 Mac公钥。 如果失败则运行失败。
  6. 在iOS设备中,开始运行时,用第5步的Mac 公钥对第1步生成CodeResources文件进行解密,判断文件是否被篡改, 并将取出的所有文件的hash值进行 一一核对。如果有一项不通过,则代表有问题。

备注:部分笔记包含有MJ老师的学习资料。

猜你喜欢

转载自blog.csdn.net/goldWave01/article/details/122587108