基本原理:

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

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. Django基础篇--模板和路由分发

    Django模板 首先什么是一个模板? 简单来说就是一个网页,可以被view响应给用户 目的是为了解决复杂的显示问题 2. 模板的设置问题 setting.py中的TEMPLATES配置 1)BACK ...

  2. Fiddler抓包使用教程-乱码处理 Decode

    转载请标明出处:http://blog.csdn.net/zhaoyanjun6/article/details/73350344 本文出自[赵彦军的博客] 在 Fiddler 的工具栏中有一个 De ...

  3. (网页)JS实现alert中显示换行的方法

    转自脚本之家: 这篇文章主要介绍了JS实现alert中显示换行的方法,实例分析了两种实现alert换行的实现技巧,非常简单实用,需要的朋友可以参考下 本文实例讲述了JS实现alert中显示换行的方法. ...

  4. aws s3文件上传设置accesskey、secretkey、sessiontoken

    背景: 最近跟进的项目会封装aws S3资源管理细节,对外提供获取文件上传凭证的API,业务方使用获取到的凭证信息直接请求aws进行文件上传.因此,测试过程需要验证S3文件上传的有效性.aws官网有提 ...

  5. JMeter—断言(十一)

    参考<全栈性能测试修炼宝典JMeter实战>第六章 JMeter 元件详解中第六节断言断言用来对服务器的响应数据做验证,常用的断言是响应断言,支持正则表达式. 一.BeanShell As ...

  6. Python交互模式下代码自动补全

    这个功能是以lib的形式提供的,配置写到home下的.pythonrc文件中, 并设置好环境变量让python启动时执行初始化: # ~/.pythonrc # enable syntax compl ...

  7. 【PAT】B1039 到底买不买(20)(20 分)

    /* 琢磨了很久,当时还没做几道题,参考了柳婼的思路 */ #include<stdio.h> #include<string.h> char arr[1000]={'\0'} ...

  8. 3星|《创投42章经》:前VC投资人的商业评论文集

    创投42章经:互联网商业逻辑与投资进阶指南 作者2014年入行VC做投资人,2016年退出改作自媒体.书中主要是作者的各类商业评论的文集,少部分是跟投资相关的内容. 投资相关的内容,有些作者自己的视角 ...

  9. String类的常用方法详解

    1:获取字符串的长度length(),下标从1开始 2:将其他类型转换为String类型toStrings() 3:去除字符串首尾的空格trim() 4:分割字符串spilt() 5:比较两个字符串是 ...

  10. 【错误记录】PowerShell 超级无语的语法错误(令人怀疑人生)

    曾经做过测试,本文是本章优秀测试人员的精神,必须定位到原因,不然吃不下饭.其实可以很容易绕过这种问题. 环境: PowerShell 5.1.16299.64 Windows 10 现有代码如下: # ...