iOS app签名原理
基本原理:
公钥能够验证私钥的签名是否正确。
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签名原理的更多相关文章
- iOS App签名的原理
前言 相信很多同学对于iOS的真机调试,App的打包发布等过程中的各种证书.Provisioning Profile. CertificateSigningRequest.p12的概念是模糊的,导致在 ...
- 【腾讯Bugly干货分享】iOS App 签名的原理
本文来自 WeRead 团队博客: http://wereadteam.github.io/ iOS 签名机制挺复杂,各种证书,Provisioning Profile,entitlements,Ce ...
- iOS 应用签名原理&重签名
在苹果的日常开发中,真机测试与打包等很多流程都会牵扯到各种证书,CertificateSigningRequest,p12等.但是很多相应的开发者并不理解iOS App应用签名的原理和流程.今天着重讲 ...
- iOS App Crash原理分析
预备知识:OS X系统分析 1.内核XNU是Darwin的核心,也是整个OS X的核心.XNU本身由以下几个组件构成: Mach微核心 BSD层 libKern I/O Kit 此外,内核是模块化的, ...
- 苹果开发之App签名
如果你的Apple ID账号(可使用邮箱来注册)为Apple developer类型的话,登录之后是看不到Certificates, Indentifiers & Profiles信息的 Ap ...
- iOS 编译过程原理(2)
一.前言 <iOS编译过程的原理和应用>文章介绍了 iOS 编译相关基础知识和简单应用,但也很有多问题都没有解释清楚: Clang 和 LLVM 究竟是什么 源文件到机器码的细节 Link ...
- iOS App的加固保护原理
本文由 网易云发布. 本文从攻防原理层面解析了iOS APP的安全策略.iOS以高安全性著称,但它并非金刚不坏之身.对于信息安全而言,止大风于青萍之末是上上策,杭研深入各个细节的研发工作,正是网易产 ...
- XE6 & IOS开发之免证书真机调试(1):颁发属于自己的App签名证书(有图有真相)
网上能找到的关于Delphi XE系列的移动开发的相关文章甚少,本文尽量以详细的图文内容.傻瓜式的表达来告诉你想要的答案. 原创作品,请尊重作者劳动成果,转载请注明出处!!! 1.自己给自己颁发证书, ...
- iOS开发app启动原理及视图和控制器的函数调用顺序
main()函数是整个程序的入口,在程序启动之前,系统会调用exec()函数.在Unix中exec和system的不同在于,system是用shell来调用程序,相当于fork+exec+waitpi ...
随机推荐
- Django--数据库查询操作
MySQL是几乎每一个项目都会使用的一个关系数据库,又因为它是开源免费的,所以很多企业都用它来作为自家后台的数据库. BAT这类大公司除外,它们的业务数据是以亿级别来讨论的,而MySQL的单表6000 ...
- recovery 根据@/cache/recovery/block.map描述从data分区升级
随着android版本的更新,系统固件的大小也越来越大,升级包也越来越大,cache分区已经不够存储update.zip了,所以应用把update.zip下载到data分区,默认情况下data分区是可 ...
- ER模型试题
M公司为了便于开展和管理各项业务活动,提高公司的知名度和影响力,拟构建一个基于网络的会议策划系统. [需求分析结果] 该系统的部分功能及初步需求分析的结果如下 : (1)M公司旗下有业务部.策划部和其 ...
- iOS 多线程之GCD的简单使用
在iOS开发中,遇到耗时操作,我们经常用到多线程技术.Grand Central Dispatch (GCD)是Apple开发的一个多核编程的解决方法,只需定义想要执行的任务,然后添加到适当的调度队列 ...
- Django框架的简介
Django框架的背景 Django是一款基于Python开发的全栈式一体化Web 应用框架.2003 年问世之初,它只是 美国一家报社的内部工具,2005 年 7 月使用 BSD 许可证完成了开源. ...
- [ISE 14.7] _pn.exe 崩溃问题 点击浏览崩溃问题
前言 装了大半天的ISE 14.7 结果新建工程的时候只要点击浏览文件夹,直接无响应,其实和其他_pn.exe崩溃是一样的. 解决方法 第一步:非常重要,进行文件备份,将"F:\Xilinx ...
- Android Studio IDE的 LogCat如何过滤指定应用的调试信息
http://blog.csdn.net/wangqing830414/article/details/40377979 打开 LogCat在搜索框右侧的No Filters中选择 Edit Filt ...
- Spring Boot开发Web应用
静态资源访问 在我们开发Web应用的时候,需要引用大量的js.css.图片等静态资源. 默认配置 Spring Boot默认提供静态资源目录位置需置于classpath下,目录名需符合如下规则: /s ...
- Ros使用Arduino 1安装Arduino IDE
安装Arsuino IDE sudo apt-get install arduino 设置库文件路径 在使用ROS的库文件时,必须在代码的开头包括: #include <ros.h> 接下 ...
- mysql函数之截取字符串
文章摘取自http://www.cnblogs.com/zdz8207/p/3765073.html 练习截取字符串函数(五个) mysql索引从1开始 一.mysql截取字符串函数 1.left(s ...