基本原理:

公钥能够验证私钥的签名是否正确。

Apple后台有一个私钥A,iOS内置一个公钥A,与私钥A对应。(A:代表Apple,即苹果)

本地产生一对公钥L、私钥L,(L:代表Local,即本地),私钥L保存在本地,公钥L(也就是.certSigningRequest文件)传到apple后台,签名后生成证书,可下载至本地。证书的作用是可以验证私钥的签名,另外XCode在给app签名时也会通过证书找到对应的私钥,一个证书对应一个私钥(因为一个证书就是一个公钥,只能对应一个私钥)。

ps:开发中,公钥对应从开发者网站上下的certificate文件,私钥对应.p12文件

Provision Profile:

描述文件,其中包含证书,及app的相关信息(如entitlements,bundle id,支持的device id列表之类的,这里只讨论跟签名相关的内容),app打包时会内嵌一个embedded.mobileprovison文件,这个文件会被apple用私钥A签名。

所以一个app被装到iPhone上的验证步骤如下:

iOS先通过内置的公钥A来验证embedded.mobileprovison文件的正确性,验证通过后从embedded.mobileprovison文件中取出公钥L(也就是证书certificate),来验证app是否被私钥L签名,当然一个embedded.mobileprovison文件中可能包含多个证书,推测此时的验证逻辑为,app只要被其中一个证书验证通过(即只要被一个其中一个证书对应的私钥签名),就认为app签名正确,另外安装时系统还会同步验证embedded.mobileprovison里的其他信息,如entitlement文件,基本原理就是验证app签名后的entitlement权限内容是否与embedded.mobileprovison里包含的entitlement文件一致(当然其中包括bundle id的验证,只不过这里只验证entitlement权限内容中的bundle id,而不去验证info.plist文件中的bundle id,iOS app签名时会包含entitlement文件内容,即签名时可以指定此app支持哪些权限),所以我们在重签名app的时候需要重新指定entitlement权限,使其与embeded.mobileprovison文件中的entitlement文件内容一致。

开发中常遇到的问题:(一般在手动签名的过程中可能会遇到)

一般来说开发中的embedded.mobileprovision文件都是从开发者网站上下载的,所以这个文件的正确性一般来说都是没问题的,所以如果一个app不能被装到iPhone上,一个可能的原因就是签名这个app的私钥所对应的证书(certificate,即公钥)没有在描述文件中,此时的解决办法就是重新生成描述文件,让其包含对应的证书(certificate)。另外跟签名相关的原因可能是证书(certificate)过期(意味着公钥过期,因为私钥是与之一一对应的,所以私钥也过期了,需要重新生成)。

另外一个常见的原因就是app签名后的entitlement权限内容与embeded.mobileprovision文件中的entitlement内容不一致,此时需要修改app签名时的entitlement权限内容,codesign --entitlements参数就是在签名的时候指定app支持哪些权限(ps:查看app重签名之前支持哪些权限可通过命令 codesign -d --entitlements :- Payload/GradleTest.app)。

例:

codesign -f -s "iPhone Distribution: ABC Information Technology Co., Ltd." --entitlements Entitlements.plist Payload/$1.app

iOS app签名原理的更多相关文章

  1. iOS App签名的原理

    前言 相信很多同学对于iOS的真机调试,App的打包发布等过程中的各种证书.Provisioning Profile. CertificateSigningRequest.p12的概念是模糊的,导致在 ...

  2. 【腾讯Bugly干货分享】iOS App 签名的原理

    本文来自 WeRead 团队博客: http://wereadteam.github.io/ iOS 签名机制挺复杂,各种证书,Provisioning Profile,entitlements,Ce ...

  3. iOS 应用签名原理&重签名

    在苹果的日常开发中,真机测试与打包等很多流程都会牵扯到各种证书,CertificateSigningRequest,p12等.但是很多相应的开发者并不理解iOS App应用签名的原理和流程.今天着重讲 ...

  4. iOS App Crash原理分析

    预备知识:OS X系统分析 1.内核XNU是Darwin的核心,也是整个OS X的核心.XNU本身由以下几个组件构成: Mach微核心 BSD层 libKern I/O Kit 此外,内核是模块化的, ...

  5. 苹果开发之App签名

    如果你的Apple ID账号(可使用邮箱来注册)为Apple developer类型的话,登录之后是看不到Certificates, Indentifiers & Profiles信息的 Ap ...

  6. iOS 编译过程原理(2)

    一.前言 <iOS编译过程的原理和应用>文章介绍了 iOS 编译相关基础知识和简单应用,但也很有多问题都没有解释清楚: Clang 和 LLVM 究竟是什么 源文件到机器码的细节 Link ...

  7. iOS App的加固保护原理

    本文由  网易云发布. 本文从攻防原理层面解析了iOS APP的安全策略.iOS以高安全性著称,但它并非金刚不坏之身.对于信息安全而言,止大风于青萍之末是上上策,杭研深入各个细节的研发工作,正是网易产 ...

  8. XE6 & IOS开发之免证书真机调试(1):颁发属于自己的App签名证书(有图有真相)

    网上能找到的关于Delphi XE系列的移动开发的相关文章甚少,本文尽量以详细的图文内容.傻瓜式的表达来告诉你想要的答案. 原创作品,请尊重作者劳动成果,转载请注明出处!!! 1.自己给自己颁发证书, ...

  9. iOS开发app启动原理及视图和控制器的函数调用顺序

    main()函数是整个程序的入口,在程序启动之前,系统会调用exec()函数.在Unix中exec和system的不同在于,system是用shell来调用程序,相当于fork+exec+waitpi ...

随机推荐

  1. Spark性能优化(基于Spark 1.x)

    Task优化:    1.慢任务的性能优化:可以考虑减少每个Partition处理的数据量,同时建议开启spark.speculation(慢任务推导,当检测的慢任务时,会同步开启相同的新任务,谁先完 ...

  2. maven(一):是否有必要使用maven

    以下是普通项目和maven项目 分别引入spring core模块的区别 1,假设我们有十个项目,都需要引入spring core模块,那么需要十份重复的Spring core.jar和commons ...

  3. 03-13_WLST导航和定位MBean

    本文重点:WLST导航和定位MBean     MBean切换图 如上:红色的字体表示切换的命令.ls和cd是在当前树下切换,其他命令是在不同树之间切换. 其中: DomainMBeanServer有 ...

  4. IE push方法,最后一个参数后面不能跟",",否则报语法错误

    var columns = [[]]; columns[0].push( { field: 'ADDNAME', title: '添加人', width: 80, }, { field: 'ADDDT ...

  5. redis数据库的简单介绍

    NoSQL:一类新出现的数据库(not only sql) 泛指非关系型的数据库 不支持SQL语法 存储结构跟传统关系型数据库中的那种关系表完全不同,nosql中存储的数据都是KV形式 NoSQL的世 ...

  6. tkinter学习系列之(六)Radiobutton控件

    目录 目录 前言 (一)基本属性 (二)在Frame里布局: 目录 前言 Radiobutton单选框,在一组选框中,只能选中一个. (一)基本属性 (1)特有属性: value 按钮的值 varia ...

  7. Linux 小知识翻译 - 「版本号」的命名方式

    包括OS,所有的软件都有版本号信息.一般来说,版本号的增大表示软件的功能增强了或者修正了一些Bug,也就是表示软件更新了. 版本号的命名方式没有统一的标准.每种软件都不一样. 大部分情况下,版本号以「 ...

  8. January 15th, 2018 Week 03rd Monday

    We got things to do. Places to go. People to see. Futures to make. 我们有很多事情要做,有很多地方要去,有很多人要见,有很多美好的未来 ...

  9. FileInputStream与FileOutputStream学习笔记

    这是我的第一篇博客,纪念一下吧! 最近学习了IO流,想着学长说的话,就突然想要写写博客了,别管这是什么逻辑了,进入正题. 一.FileInputStream 1.概念 FileInputStream是 ...

  10. 改变javascript函数内部this指针指向的三种方法

    在查了大量的资料后,我总结了下面的三条规则,这三条规则,已经可以解决目前我所遇到的所有问题.规则0:函数本身是一个特殊类型,大多数时候,可以认为是一个变量. function a() { alert( ...