iOS APP签名机制原理详解

苹果的需求

  1. 为了保证系统的安全性,所有iPhone上安装的应用必须是经过苹果授权的
  2. 安装包不需要上传到App Store也能被安装 (开发调试 企业灰度)
  3. 防止证书权限滥用:设备限制、指定APP、iCloud/PUSH/后台运行等附加权限控制

苹果的解决方案:双层代码签名+描述文件:

这里画一张图附上:

在iOS出来之前,主流的操作系统(MacOS/Windows)软件随便从哪里下载都能运行,系统安全存在隐患,盗版软件、病毒入侵、静默安装等等,苹果希望解决类似的问题,保证在iPhone iOS上的APP都是经过苹果官方允许的,怎样保证呢?就是通过代码签名。

如果要实现验证,最简单的方式就是苹果官方生成一对RSA公私钥,在iOS系统中内置一个公钥,私钥由苹果后台保存,我们上传APP到App Store时苹果后台用私钥对APP数据进行加密,iPhone下载APP后用公钥验证这个签名就可以确认APP是否经过允许或被三方篡改过。但是,我们安装APP并不仅仅只有App Store这一个方式,比如真机调试、企业包等,所以只靠这个简单的数字签名方式是不够的。

于是苹果设计了双层签名的机制,我们都知道iOS的应用开发必须在Mac系统下进行,正是由于这个依赖关系,双层签名才有了基础:

  1. 在Mac系统中生成一对非对称加密算法的公私钥M(Xcode会帮你做好)
  2. 苹果自己有固定的一对公私钥,正如上述最简单的代码签名中提到的:私钥A在苹果后台,公钥A在每个iOS系统的手机中
  3. 把公钥M以及一些开发者信息(也就是CSR文件)发送给苹果后台,用苹果后台的私钥A对公钥M签名,得到一份包含公钥M以及其签名结果的数据就是证书(.p12)。
  4. 在开发时,当我们打包时会用本地的私钥M(也就是可导出给小伙伴的开发者证书)对这个APP进行签名,同时把第三步得到的证书一起打包进APP里,然后安装到手机上(真机联调)或者提交App Store审核
  5. 安装时,iOS系统取得内置公钥A去验证公钥M的数字签名证书是否正确
  6. 验证公钥M是苹果认证过的后,再用公钥M去验证APP的签名,这样就间接验证了这个APP的安装是经过苹果允许的了(注意这里只验证安装行为,不验证APP是否被改动,因为开发阶段APP内容总是不断变化的)

有了上面的过程已经可以保证开发者的认证和程序的安全了,但是如果只有上述的过程,那岂不是只要申请了一个证书就可以安装到所有的iOS设备了?所以,苹果又增加了授权文件(Provisioning profile)的验证,Provisioning profile一般包括三样东西:证书、APP ID、设备。

描述文件是在AppleDevelop网站创建的(在Xcode中填上AppleID它会代办创建),Xcode运行时会打包进入APP内。在开发时,编译完一个 APP 后,用本地的私钥M对这个APP进行签名,同时把从苹果服务器得到的 Provisioning Profile 文件打包进APP里,文件名为embedded.mobileprovision,当把APP安装到手机上时,iOS系统会进行验证。

以上就是iOS应用签名的原理,下一篇我会基于这个原理给大家手撸一个自动重签名的脚本。希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • 详解IOS微信上Vue单页面应用JSSDK签名失败解决方案

    背景 手机型号: 型号:iphone 7 / iphone xs max 版本:ios 10.3.1 / ios 12.1 微信版本:WeChat 6.7.3 问题还原: Vue应用(vue-router)上使用history模式,在某个页面内调用微信JSSDK相关API,如扫码.分享等,使用当前页面URL总会出现签名错误(invalid signature),导致API调用失败. 问题根源 Vue-Router进行路由切换的时候,总是会操作浏览器的历史记录,从而响应页面URL变化. 在JSSD

  • iOS 基于AFNetworking下自签名证书配置的方法

    自从https推出以后,客户端对网络安全的要求程度也越来越高.甚至在iOS9之后,苹果强制要求必须支持https请求. https是什么呢?它又是如何保证数据安全的呢? 简单来说,https就是http+TLS/SSL.就是在http上又加了一层处理加密信息的模块.服务端和客户端的信息传输都会通过TLS进行加密,也就说传输中的数据都是加密的,如果不知道私钥,是无法真正知道传输内容的真正意思的. 整个https单向验证流程简单总结如下: 就是用户发起请求,服务器响应后返回一个证书,证书中包含一些基

  • iOS之Https自签名证书认证及数据请求的封装原理

    摘要: 在WWDC 2016开发者大会上,苹果宣布了一个最后期限:到2017年1月1日 App Store中的所有应用都必须启用 App Transport Security安全功能.App Transport Security(ATS)是苹果在iOS 9中引入的一项隐私保护功能,屏蔽明文HTTP资源加载,连接必须经过更安全的HTTPS.苹果目前允许开发者暂时关闭ATS,可以继续使用HTTP连接,但到年底所有官方商店的应用都必须强制性使用ATS. 项目中使用的框架是AFNetworking 3.

  • IOS 签名错误codesign failed with exit code 1解决方法

    IOS 签名错误 前日,Macbook的硬盘不幸挂了,于是将开发环境迁移到Mac Mini下.大家知道,对于Xcode来说,最麻烦的就是各种证书.ProvisioningProfile的配置问题.将原来的各种开发证书和.p12证书导入到mini上,接下来就碰到了各种莫名其妙的问题.先是无法development(可以debug),发现是证书导错了(没有用Agent证书,只有Agent可以发布).于是制作证书请求,重新下载证书. 等到部署的问题解决后,又发现无法调试--真机可以,但模拟器不行,一进

  • iOS安全防护系列之重签名防护与sysctl反调试详解

    一 重签名防护 想自己的app不被重签名,可以在代码中检测签名信息,然后采取措施. 1.查看证明组织单位 或者进入.app的包内容,查看embedded.mobileprovision信息security cms -D -i embedded.mobileprovision 找到<key>application-identifier</key>的value的第一部分就是 2.利用签名信息进行重签名防护 void checkCodesign(NSString *id){ // 描述文

  • Android和iOS包批量重签名

    本文实例为大家分享了Android和iOS包批量重签名的具体代码,供大家参考,具体内容如下 Android篇 环境要求 1 安装winrar,然后配置winrar的环境变量,要用到winrar指令 2 配置java的bin目录到环境变量,要用到jarsigner指令 重签名步骤说明: 1 从母包复制一个子包 2 删除子包的签名文件META-INFO 3 根据需要修改子包的文件,比如渠道号文件之类 4 重签名子包 对应的python脚本 import os import sys import sh

  • iOS中的ipa重签名(逆向必备)

    2018开篇,这回要讲的是iOS重签名,网上重签名的工具太多了,我试用了一下,都还挺好使.但是,你不知道,我是个喜欢装逼的人吗?用工具怎么够酷呢?对,装逼得用终端.接下来的操作都是在终端中进行,开始你的装逼之旅吧! 一.重签名准备工作: •找到开发者证书和配置文件: 列出所有开发者证书文件: security find-identity -p codesigning -v •找一个开发环境配置文件生成entitlements.plist文件,后面签名要用到: security cms -D -i

  • iOS APP签名机制原理详解

    苹果的需求 为了保证系统的安全性,所有iPhone上安装的应用必须是经过苹果授权的 安装包不需要上传到App Store也能被安装 (开发调试 企业灰度) 防止证书权限滥用:设备限制.指定APP.iCloud/PUSH/后台运行等附加权限控制 苹果的解决方案:双层代码签名+描述文件: 这里画一张图附上: 在iOS出来之前,主流的操作系统(MacOS/Windows)软件随便从哪里下载都能运行,系统安全存在隐患,盗版软件.病毒入侵.静默安装等等,苹果希望解决类似的问题,保证在iPhone iOS上

  • Python代码块及缓存机制原理详解

    这篇文章主要介绍了Python代码块及缓存机制原理详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 1.相同的字符串在Python中地址相同 s1 = 'panda' s2 = 'panda' print(s1 == s2) #True print(id(s1) == id (s2)) #True 2.代码块: 所有的代码都需要依赖代码块执行. ​ 一个模块,一个函数,一个类,一个文件等都是一个代码块 ​ 交互式命令中, 一行就是一个代码块

  • Mysql MVCC机制原理详解

    什么是MVCC MVCC,全称Multi-Version Concurrency Control,即多版本并发控制.MVCC是一种并发控制的方法,一般在数据库管理系统中,实现对数据库的并发访问,在编程语言中实现事务内存. 我们知道,一般情况下我们使用mysql数据库的时候使用的是Innodb存储引擎,Innodb存储引擎是支持事务的,那么当多线程同时执行事务的时候,可能会出现并发问题.这个时候需要一个能够控制并发的方法,MVCC就起到了这个作用. Mysql的锁和事务隔离级别 在理解MVCC机制

  • Python进阶之import导入机制原理详解

    目录 前言 1. Module组成 1.1 Module 内置全局变量 2. 包package 2.1 实战案例 3.sys.modules.命名空间 3.1 sys.modules 3.2 命名空间 4. 导入 4.1 绝对导入 4.2 相对导入 4.3 单独导入包 5. import运行机制 5.1 标准import,顶部导入 5.2 嵌套import 前言 在Python中,一个.py文件代表一个Module.在Module中可以是任何的符合Python文件格式的Python脚本.了解Mo

  • Java基础学习之反射机制原理详解

    目录 一.什么是反射 二.反射的原理 三.反射的优缺点 四.反射的用途 五.反射机制常用的类 六.反射的基本使用 一.什么是反射 (1)Java反射机制的核心是在程序运行时动态加载类并获取类的详细信息,从而操作类或对象的属性和方法.本质是JVM得到class对象之后,再通过class对象进行反编译,从而获取对象的各种信息. (2)Java属于先编译再运行的语言,程序中对象的类型在编译期就确定下来了,而当程序在运行时可能需要动态加载某些类,这些类因为之前用不到,所以没有被加载到JVM.通过反射,可

  • java synchronized 锁机制原理详解

    目录 前言: 1.synchronized 的作用: 2.synchronized 底层语义原理: 3. synchronized 的显式同步与隐式同步: 3.1.synchronized 代码块底层原理: 3.2.synchronized 方法底层原理: 4.JVM 对 synchronized 锁的优化: 4.1.锁升级:偏向锁->轻量级锁->自旋锁->重量级锁 4.1.1.synchronized 的 Mark word 标志位: 4.1.2.锁升级过程: 4.2.锁消除: 4.3

  • python内存管理机制原理详解

    python内存管理机制: 引用计数 垃圾回收 内存池 1. 引用计数 当一个python对象被引用时 其引用计数增加 1 ; 当其不再被变量引用时 引用计数减 1 ; 当对象引用计数等于 0 时, 对象被删除(引用计数是一种非常高效的内存管理机制) 2. 垃圾回收 垃圾回收机制: ① 引用计数 , ②标记清除 , ③分带回收 引用计数 : 引用计数也是一种垃圾收集机制, 而且也是一种最直观, 最简单的垃圾收集技术.当python某个对象的引用计数降为 0 时, 说明没有任何引用指向该对象, 该

  • Python类和实例的属性机制原理详解

    实例是具象化的类,它可以作为类访问所有静态绑定到类上的属性,包括类变量与方法,也可以作为实例访问动态绑定到实例上的属性. 实例1: class A: work = list("hello") kind = list("world") another = 1 def test1(self): print(self.work, self.kind, self.another) self.work[0], self.kind [0] = "t", &q

  • ios的签名机制详解

    前言 iOS 签名机制挺复杂,各种证书,Provisioning Profile,entitlements,CertificateSigningRequest,p12,AppID,概念一堆,也很容易出错,本文尝试从原理出发,一步步推出为什么会有这么多概念,希望能有助于理解 iOS App 签名的原理和流程. 目的 先来看看苹果的签名机制是为了做什么.在 iOS 出来之前,在主流操作系统(Mac/Windows/Linux)上开发和运行软件是不需要签名的,软件随便从哪里下载都能运行,导致平台对第三

  • IOS 获取APP 版本号的实例详解

    IOS 获取APP 版本号的实例详解 看代码的时候看到一句,用于获取.plist文件的版本号 labelVersion.text = [NSString stringWithFormat:@"v%@", [[NSBundle mainBundle] objectForInfoDictionaryKey:(NSString*)kCFBundleVersionKey]]; 比较感兴趣的是后面的参数 kcFBundleVersionKey ,竟然是CFBundle.h已经定于好的属性,下面有

随机推荐