一、代码签名

那么咱们来剖析一下,它有些什么需求:

  1. 装置包不需求上传到App Store,能够直接装置到手机上.

  2. 苹果为了确保体系的安全性,又有必要对装置的APP有肯定的操控权

  3. 经过苹果允许才干够装置

  4. 不能被乱用导致非开发APP也能被装置

  5. 为了完结这些需求,iOS签名的复杂度也就开始增加了,苹果这儿给出的计划是双层签名.

签名流程图:

iOS签名原理
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 以及其签名,把这份数据称为证书。

  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
//意思:读取并履行文件中的指令。但有一个条件,脚本文件需求有可履行权限。

iOS签名原理

iOS签名原理

改变权限:chmod

iOS签名原理

四、总结

  1. 代码签名:为了完结这些需求,iOS签名的复杂度也就开始增加了,苹果这儿给出的计划是双层签名
  2. 重签名:Xocde提供了签名东西,codesign,咱们经过几个指令就能够完结重签名,Shell脚本,也便是用各类指令预先放入到一个文本文件中,方便一次性履行的一个脚本文件。