iOS签名原理

一、代码签名

那么我们来分析一下,它有些什么需求:

  1. 安装包不需要上传到App Store,可以直接安装到手机上.

  2. 苹果为了保证系统的安全性,又必须对安装的APP有绝对的控制权

  3. 经过苹果允许才可以安装

  4. 不能被滥用导致非开发APP也能被安装

  5. 为了实现这些需求,iOS签名的复杂度也就开始增加了,苹果这里给出的方案是双层签名.

签名流程图: image.png iOS的双层代码签名流程这里简单梳理一下,这也不是最终的iOS签名原理.iOS的最终签名在这个基础上还要稍微加点东西.

首先这里有两个角色.一个是iOS系统 还有一个就是我们的Mac系统.因为iOS的APP开发环境在Mac系统下.所以这个依赖关系成为了苹果双层签名的基础.

  1. 在Mac系统中生成非对称加密算法的一对公钥\私钥(你的Xcode帮你代办了).这里称为公钥M 私钥M . M = Mac

  2. 苹果自己有固定的一对公私钥,跟之前App Store原理一样,私钥在苹果后台,公钥在每个iOS系统中.这里称为公钥A , 私钥A. A=Apple

  3. 把公钥M 以及一些你开发者的信息,传到苹果后台(这个就是CSR文件),用苹果后台里的私钥 A 去签名公钥M。得到一份数据包含了公钥M 以及其签名,把这份数据称为证书。

    扫描二维码关注公众号,回复: 15159531 查看本文章
  4. 在开发时,编译完一个 APP 后,用本地的私钥 M(今后你导出的P12) 对这个 APP 进行签名,同时把第三步得到的证书一起打包进 APP 里,安装到手机上。

  5. 在安装时,iOS 系统取得证书,通过系统内置的公钥 A,去验证证书的数字签名是否正确。

  6. 验证证书后确保了钥 M 是苹果认证过的,再用公钥 M 去验证 APP 的签名,这里就间接验证了这个 APP 安装行为是否经过苹果官方允许。(这里只验证安装行为,不验证APP 是否被改动,因为开发阶段 APP 内容总是不断变化的,苹果不需要管。)

有了上面的过程,已经可以保证开发者的认证,和程序的安全性了。 但是,你要知道iOS的程序,主要渠道是要通过APP Store才能分发到用户设备的,如果只有上述的过程,那岂不是只要申请了一个证书,就可以安装到所有iOS设备了?

二、描述文件的产生

苹果为了解决应用滥用的问题,所以苹果又加了两个限制.

第一限制在苹果后台注册过的设备才可以安装.

第二限制签名只能针对某一个具体的APP.

并且苹果还想控制App里面的iCloud/PUSH/后台运行/调试器附加这些权限,所以苹果把这些权限开关统一称为Entitlements(授权文件).并将这个文件放在了一个叫做Provisioning Profile(描述文件)文件中.
    
描述文件是在AppleDevelop网站创建的(在Xcode中填上AppleID它会代办创建),Xcode运行时会打包进入APP内. 所以我们使用CSR申请证书时,我们还要申请一个东西!! 就是描述文件!
    
在开发时,编译完一个 APP 后,用本地的私钥M对这个APP进行签名,同时把从苹果服务器得到的 Provisioning Profile 文件打包进APP里,文件名为embedded.mobileprovision,把 APP 安装到手机上.最后系统进行验证。
    
复制代码

三、重签名

1、codesing重签名

可以通过pp助手,下载已经砸过壳的app。或者自己通过越狱工具,砸壳工具等获得ipa。

Xocde提供了签名工具,codesign,我们通过几个命令就可以完成重签名

codesing命令(用于给ipa重签名):

$security find-identity -v -p codesigning 列出钥匙串里可签名的证书

$Codesign –fs “证书串” 文件名   强制替换签名

$Chmod +x 可执行文件   给文件添加权限

$security cms -D -i ../embedded.mobileprovision 查看描述文件

$codesign -fs “证书串” --no-strict --entitlements=权限文件.plist APP包

$Zip –ry 输出文件 输入文件  将输入文件压缩为输出文件 


复制代码

2、xcode重签名

  1. 删除插件和带有插件的.app包(比如Watch)

  2. 对Frameworks里面的库进行重签名

  3. 给可执行文件 +x(可执行)权限

  4. 添加描述文件(新建工程,真机编译得到)

  5. 替换BundleID

  6. 通过授权文件(Entilements)重签.app包

shell

shell是一种特殊的交互式工具,它为用户提供了启动程序、管理文件系统中文件以及运行在系统上的进程的途径。Shell一般是指命令行工具。它允许你输入文本命令,然后解释命令,并在内核中执行。 Shell脚本,也就是用各类命令预先放入到一个文本文件中,方便一次性执行的一个脚本文件。

$source FileName	
//意思:在当前shell环境中读取并执行FileName中的命令
//特点:
//命令可以强行让一个脚本去立即影响当前的环境(一般用于加载配置文件)。
//命令会强制执行脚本中的全部命令,而忽略文件的权限。

$bash FileName  、  $zsh FileName   
//意思:重新建立一个子shell,在子shell中执行脚本里面的句子。

$./FileName
//意思:读取并执行文件中的命令。但有一个前提,脚本文件需要有可执行权限。

复制代码

image.png

image.png

改变权限:chmod image.png

四、总结

  1. 代码签名:为了实现这些需求,iOS签名的复杂度也就开始增加了,苹果这里给出的方案是双层签名
  2. 重签名:Xocde提供了签名工具,codesign,我们通过几个命令就可以完成重签名,Shell脚本,也就是用各类命令预先放入到一个文本文件中,方便一次性执行的一个脚本文件。

猜你喜欢

转载自juejin.im/post/7228504953814532133
今日推荐