Apple 签名原理

前言

签名是什么? 我们的 APP 是如何签名的?APP 调试为什么就可以安装呢?

数字签名就是将 APP 的 hash 值进行 RSA 加密,传送到服务端,可以验证数据有没有被修改过

我们知道 非对称加密 的两种方式

  • 公钥加密,私钥解密
  • 私钥解密,公钥解密。

APP 安装基本原理

APP 安装原理

此过程有效的保证了每一个 APP 都是经过苹果官方认证的。

问题

但是这样做有没有问题呢?简单粗暴,每次都需要上传到 App Store,再下载安装?

但是除了 从 App Store 下载安装外,还可以通过以下两种方式安装:

  1. 安装调试。
  2. 企业证书分发 APP。

针对这两种情况,怎么办呢?这种方式就满足不了需求,太简单了。

第一种情况,开发人员测试 APP ,每次真机调试总不能上传到 App Store,再下载安装?苹果为了解决这个问题,安装的过程也必须经过苹果的允许,所以签名就变得复杂了,

开发安装调试原理

  • CSR 文件
    Mac 电脑在开发过程中生成 公钥私钥,公钥其实就是我们申请证书时的根证书 CSR 文件
CSR

我们的 CSR文件是 base64 编码的公钥的一个组成部分

CSR文件

通过命令可以查看证书的其它信息:

openssl asn1parse -i -in CertificateSigningRequest.certSigningRequest

image.png
  • 前期生成证书的过程:
image.png

我们在真机调试安装 APP 用的是本地生成的 私钥 来签名的,这个 私钥 用的是我们生成 CSR 文件时的 私钥 ,(公钥、私钥都是一对一对的,公钥从私钥中计算得到)这个 私钥 就是用来给 APP 加密的。

  • 首先,iPhone 手机 在安装 操作系统时,内置的就有一个公钥,私钥在苹果服务器。

  • 手机解密 APP 过程
    安装 APP 时,手机首先会拿到 APP 的证书文件进行解密 ,因为证书是用 Mac 本地在开发过程中生成 公钥 传送到苹果服务器,苹果服务器用私钥加密生成的,所以有且只有 iPhone 内置的公钥才可以解密,解密得到 Mac 的公钥 以及 证书的 hash 值,首先会验证证书的合法性,有没有被篡改过,确认了 公钥 是苹果认证的。

  • 通过上一步的认证,就可以通过验证通过的 Mac 公钥 去解密 APP 的签名,因为 APP 使用 Mac 的私钥来加密的,验证 APP 的合法性,是否被篡改过。
    (到这里不禁感叹这个过程是多么的完美,完整的闭环,一环扣一环,整个过程都在 Apple 的控制之中)

但是,这个过程,并不能保证 APP 被篡改的,因为 APP 一直是 Mac 本地 的私钥,公钥加密的,所以 苹果 根本不需要验证 你的 APP 有没有变化,被篡改过,只认证证书是不是被认证过,是否合法!因为开发过程中,你的 APP 是不断变化的,只是验证手机的公钥能不能解开这个 APP 包,能解开就是认可的,双重认证过程。

以上如图所示:

证书申请,APP 安装,手机验证过程

这样更清晰一些:

iPhone 认证过程

这个签名的方式过程可以验证证书的合法性,可以保证每次 APP 安装到手机是经过 Apple 允许的,但是这个方式存在弊端。

权限控制

如上的过程,弊端:设备无限制,如此的话,申请一个证书就可以安装到所有的 iPhone 上了,因此苹果为了避免滥用安装的问题,就
添加了一系列的限制,最重要的:

  • 设备限制
    只有在苹果后台注册过的设备才可以安装,一个证书对应的 UDID,是有一定数量的。(众所周知的 开发账号 100 台设备的限制)

  • 签名限制
    签名只能针对某一个 APP 进行签名。

其它的限制,位置,后台,推送等等。

以上所有的权限,最终诞生了 Provisioning Profile 文件,就是所谓的 描述文件

进入目录

cd ~/Library/MobileDevice/Provisioning\ Profiles/

打开,查看

open .

image.png

随便查看一个:

cms -D -i 1ed8c939-3934-4ab0-85c5-7452b9ced2eb.mobileprovision

查看项目默认的 Provisioning Profile 文件

编译打开项目的 app 包,内部的 embedded.mobileprovision 是每个项目都会创建的

查看一下:
查看描述文件信息:$security cms -D -i 描述文件路径

security cms -D -I embedded.mobileprovision

mobileprovision 文件

可以看到是一个xml 的 plist 文件,加密过的,限制各种权限。

copy 后,创建一个 plist 文件,粘贴,查看:

embedded.mobileprovision

申请证书、打包过程

Mac 的钥匙串中可以看到,我们从苹果申请的证书:

证书

申请证书过程

  1. 本地 Mac 生成 一对 公钥 和 私钥,公钥打包到 CSR 文件到 苹果服务器去申请证书,公钥进行一系列的加密生成证书,下载至本地,对应的 私钥 是在本地由钥匙串保存在本地的,这时候本地就有两个证书:
    • 下载下来的证书
    • 私钥证书
image.png

钥匙串将下载下来的证书和本地的私钥关联起来,因为私钥和证书中的公钥是一对,这个私钥也只有 Mac 电脑有,如果别的电脑也需要打包编译App时,就需要我们常做的将这个 私钥 导出为 .p12 文件给他,因为只有有了这个 p12 文件(私钥)才能对 APP 签名。

  1. 上面也讲了,除了这些还不够,苹果还会配置 描述文件,上线后的描述文件是苹果配置的了,官方认证的,没有描述文件。

  2. 最后 Xcode 拿到申请的的证书和本地与之对应的私钥,对 APP 进行一次签名,然后将证书、描述文件同时打包进 APP 的包中,这个描述文件也是通过签名认证,开发者也无法篡改其中的内容。

在 APP 可以轻易找到 APP 的描述文件,如下:

image.png

那证书 和 APP 的签名信息在哪里呢?
APP 包中也有代码的签名信息,

image.png

Mac-O 文件中的代码签名信息

Mac-O 文件中的代码签名信息

整个过程,苹果做的其实就是两件事情:

  1. 保证安装的 App 是经过苹果认证的。
  2. 经过认证的又要限制 APP 的 一些行为,保证开发可以随时安装,所以就有了这一系列的操作。
代码签名原理

你可能感兴趣的:(Apple 签名原理)