iOS 证书与签名 解惑详解

 

iOS 证书与签名 解惑详解

分类: iPhone
iosxcodecryptographyappleiphone测试

目录(?)[+]

 

教程截图:

Learn all about how Code Signing works!

    下面是一篇有澳洲墨尔本的一名全职iOS开发者提供的文章。他在论坛上是一个很摩登的年轻人 – Adam Eberbach。

  ·Bundle identifier

  ·provisioning profiles

  ·App ID

  ·certificate signing request

  对于新手,的确很难一口气搞清楚这些东东到底有什么区别。

  下面我们来揭开它们的神秘面纱,在读完这篇文章后,你应该可以把这些东西联系起来,你能够理解它们是怎么工作,并能够顺利地在device上运行你的应用了。

  当然,这里假设你已经是一个iOS开发者,拥有IDP,并已经有一定的xcode和iOS开发经验了。如果你只是刚刚开始学习iOS,你可以先看看其它入门教程。

  好吧,我们开始了。

 

它们有多重要?

  Code signing 对你来说,最主要的意义就是它能让你的App在设备上运行。不管是你自己的设备,甲方客户的,还是在App store上购买你的消费者。

  如果没有code signing,你只可以在模拟器上,或者一台越狱过的机器上运行你的应用----当然,仅仅如此是不能满足我们的。

  模拟器的测试仅仅是一种初步测试,模拟器不能替代真机调试,因为:

·真正的设备会通常比模拟器慢

  模拟器使用的是你的MAC机上的处理器,而一台真正的iphone可远远没有这种条件。所以如果你不在设备上真正运行,你可能就会忽略实际的性能问题。

  比如你新建一个ViewBased应用,然后在viewDidLoad里面加入下列代码:

int count =200000;
NSMutableArray * array = [NSMutableArray arrayWithCapacity:count];
for (int i =0; i < count; ++i) {[array addObject:[NSString stringWithFormat:@"%d", i]];
} 

    上面这段代码在模拟器上可能1-2秒就能运行完,但是在真机上面(比如iphone 3GS),大约要花7秒左右的时间。

·设备的内存少很多

  同理的,模拟器使用你MAC上的内存,而一台真正的iphone的内存少得多。

  特别是游戏,通常会使用大量的图片,占用大量的内存。在老一点型号的机器上,一个纹理图片的大小上限是24MB,也就是1024X1024的8bit纹理图。

  内存耗尽绝对是你不想见到的,因为占用的内存超过一定范围,OS会强行退出你的app,对用户来说,就认为是你的app崩溃了。

 

·有些API只在设备上有效

  譬如In-App purchase的API,或者Instrument中的Core Animation。这些都要在真机上测试出来。(可能以后版本的iOS或者xcode能够支持,但毕竟真机测试是一种保障)

  总的来说,你没有在真机上测试过,等于你没有真的测试完。

·(译者注:一些视觉上的效果在模拟器上看到的可能会与真机不一致)

 

  在Xcode中有一些懒人的方法:

  在organizer的界面中,选中devices 右键Developer Profile,你可以看到这样一个菜单。

  里面有大部分这篇文章将要讲到的内容。

Automatic provisioning with Xcode 4

  这里你可以sign in你的开发者账号,自动登记你的app并运行到你的device上。

  当然,如果这样总是好用的话,这篇文章就没有意义了。

  作为一个开发者,你应该知道更多。

Public and Private Keys 公钥私钥

  在继续剖析之前,我们先简单地解析公钥私钥。

  这世上有两种加密方法:symmetric cryptography 对称密码和 asymmetric cryptography非对称密码。

  对于对称密码,只有一种key。譬如你有一个密钥,以及对应的一个加密过的信息。

  那只有知道密钥的人可以解读这个信息。

  对于非对称密码,有两个key – 公钥和私钥。

   譬如你用某个私钥加密一些信息,别人收到这个信息后可以通过那个私钥对应的公钥来加密。这样他们就可以肯定,这个信息是从你那里来的(至少是你加密的)。

  这个私钥就相当于一个“签名”。 (你加的密,就是你签的字)

  而这个,就是在iOS中code signing背后的原理。

 

Code Signing Objects

  与Code Signing有关的东西有 :

  Provisioning Profiles,App IDs,UDIDs …

  在这一节,我们会一个一个地解说。

  我用Core Data绘制了一个图表,用来描述这些对象之间的关系。

Objects related to Code Signing

  这是针对开发人员的 (Development Profile),发布人员的图会有小小区别。

 

私钥 Private Key:

  在Mac OS X 以后,key由一个叫做 Keychain的app来管理。 你可以在 Application\Utilities 中找到。

运行Keychain,你可以看到在你的名下有哪些公钥和私钥。类似这样的:

Keychain Access showing public/private keys

(这是私隐,要加码的)

  如果你没有看到任何key的列表,不用担心。在你第一次使用认证的时候,Keychain会帮你创建。

  在这里列出的key是你的provisioning或者code signing的基础。

  你必须有key才能sign code或者在App store中发布你的app。

  如果key丢失了?

  你必须把整个流程重新做一次 – 因为没有key,你的认证不再有效,你的provisioning profile只会生成error。你会浪费很多时间,所以,好好保管它。

  如果你没有备份过,我建议你马上把它export出来,通过File\Export Items ,保存在一个安全的地方,例如一个很小的分区中。或者通过你的Mobile Me账号来同步保存。

 

有多个Key?

  如果你在不同的Mac机上创建过account,你将会有多个key。

  这样会带来一个问题,在机器A上生成的认证,在没有私钥的机器B上会失效。

  所以,你可以把你所有的key复制到你所有的Mac机上。(这样就不用烦了)

  或者,我更建议只用一个Key。

UDID

  UDID (Unique Device Identifier)是区分物理设备的唯一标识。

  所有你的iPhone肯定有一个与众不同的UDID,包括你的iPad等等。

  通常,UDID会是一个40位十六进制字符串。

  也就是下图的identifier:

How to see your device's UDID in XCode Organizer

  如果App不是从app store上来,你的代码需要有UDID的信息才能运行。

  怎么知道你拥有的设备的UDID?有几个方法。

  1 如果你的设备连到Xcode的机器上,你可以在Organizer中看到UDID。

  2 没有xcode的朋友也可以,在iTunes的 Summary界面,有serial number(序列号)的信息,点击可以看到。

How to find a device's UDID in iTunes

  3 这是最简单的方法,在App Store中下载一个Ad Hoc Helper吧。

 

Certificate 认证

  认证,就是你的个人开发者认证,或者更华丽地说:“Apple Worldwide Developer Relations Certification Authority Certificate”(这不翻译了),

  这个本质上就是一些代表着信任-授权的数据而已。

  获取一个认证,你需要子啊Keychain Access中生成一个 Certificate Signing Request,并把它发给Apple。这会创建一对 公钥-私钥(如果还没有的话)。

  Apple收到后会验证信息,然后给你创建一个认证。

 

App ID

  在Xcode4中创建一个项目,你要提供 Product Name 和 Company Identifier的信息。

  Product Name,就是你的app的一个较短的名称。

  Company identifier,通常会是一个反转的DNS串,例如:com.mycompanyname

  这两者合起来,就似乎Bundle Identifier。你会在Info.plist中找到。

  对于每一个你要发布的app,你需要到iTunes Developer Center中注册你的App ID。如下图。

Finding the Bundle Identifier in your Info.plist

  这个需要与你在Info.plist中设置的保持一致。 

Provisioning Profile

  把前面讲到的东西合起来:

  ·App ID (app的唯一标识)

  ·UDID (在某台设备上运行的唯一标识)

  ·Certificate (开发者认证)

  就是所谓的Provisioning Profile。

 

  Provisioning Profile 通过xcode或者itunes导入到device中,或者打包到一个包含app和profile的.ipa文件中。

  你可以在iOS Provisioning Portal 中创建你的Provisioning Profile。

Creating a Provisioning Profile in the iOS Provisioning Portal

  新建一个,有一下几个步骤:

  ·为profile命名,以后你会在xcode的organizer,Buid Settings 以及其它一些地方中看到

  ·选择你的certificate

  ·选择你的App ID,要如Info.plist中的一致。

  ·选择要应用到的设备。通常,我都是把我的设备全选的。

 

个人用途的签名 Signing

  假设你已经有一个准备测试的App,而你有IDP,并且处理好Provisioning Profile的事情了。

  现在你清楚已经知道它们的逻辑了,如果你新加入,下面这些是你要做的:

  1 检查你的公钥私钥,为以后检查方便,起个好名吧。

  2 用Keychain Access来创建你的开发认证。然后下载Apple给你的认证,双击安装,然后你可以在Keychain中看到了吧。

  3 下载“Apple Worldwide Developer Relations Certification Authority Certificate”(WWDR)也是双击安装,也可以到Keychain中看到。

  4 检查你项目的Bundle ID,到Provisioning Portal中创建一个一致的App ID。

  5 在Provisioning Portal中加入你想要的UDID。(全部加上好了)

  6 针对你的Certificate创建Provisioning Profile, 指定你的app ID 和UDID。

  7 下载刚刚创建的Profile,拖到你的xcode Organizer中。

  然后,你就可以sign你的project,并让它们在你的device上运行了。

  在Target – Build Settings ,往下滚动到 Code Signing一节。

  试试编辑一下Debug schema,它适合于团队协作:

  在Automatic ProfileSelector中选择“iPhone Developer”,你会看到你的认证已经自动选上了。

  一切都搞定了,连接你的device,在xcode中选择Debug build,build & run。

  xcode会到你的设备里装上这个provisioning profile,并运行你的App。

 

原文链接地址:http://www.cnblogs.com/andyque/archive/2011/08/30/2159086.html

转载于:https://www.cnblogs.com/iOS-mt/p/4243230.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/398531.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Julia学习笔记(一)——入门

文章目录1 入门1.1 启动与退出1.1.1 启动1.1.2 退出1.2 编译文件1.3 变量1.3.1 基本介绍1.3.2 重定义1.3.3 变量名合法性1 入门 1.1 启动与退出 1.1.1 启动 在没有任何IDE的帮助下&#xff0c;使用cmd启动黑窗口来尝试julia是一种最简单的方法。我们称进入julia后的黑窗口为…

Linux学习宝典

文章目录1 虚拟机1.1 简介1.2 Linux版本1.2.1 内核1.2.2 发行版1.3 文件和目录1.3.1 单用户操作系统和多用户操作系统1.3.2 window文件系统1.3.3 Linux下的文件系统2 概述2.1 为什么要学习命令2.2 一些基本操作和说明3 指令和选项4 基础指令4.1 ls指令4.1.1 讲解4.1.2 选项4.1.…

《华为工作法读后感》

开篇 首先不得不说《华为工作法》是一本很好的书籍。感谢我们领导的照顾和用心&#xff0c;才使得我们又有了一些对社会 对工作 对生活等等的认知 。 之前的我是不怎么读书的&#xff0c;因为个人原因读的慢&#xff0c;每句话都要了解其中寓意之后才继续读下去,还有就是工作…

Redis发布与订阅——PUBLISH SUBSCRIBE

2019独角兽企业重金招聘Python工程师标准>>> &#xfeff;Redis发布与订阅——PUBLISH & SUBSCRIBE 一般来说&#xff0c;发布与订阅&#xff08;又称pub/sub&#xff09;的特点是订阅者&#xff08;listener&#xff09;负责订阅频道&#xff08;channel&…

Android 网络通信架构学习

最近跟着云课堂上的极客学院做安卓APP&#xff0c;学习了课程里面介绍的一种网络通信架构。清晰明了&#xff0c;比我自己东一块西一块拼凑出来的要好很多。在这里记录一下。 云课堂的连接&#xff1a;http://study.163.com/course/courseMain.htm?courseId917001 目录&#x…

网络爬虫(二)——Xpath和Selenium的使用

文章目录2 网络爬虫进阶2.1 Xpath2.1.1 Xpath解析原理2.1.2 信息提取2.1.2.1 获取所有结点2.1.2.2 获取子节点2.1.2.3 获取父节点2.1.2.4 获取文本2.1.3 属性匹配2.1.3.1 单个属性匹配2.1.3.2 多个属性匹配3.1 Selenium3.1.1 概述3.1.2 安装3.1.3 元素定位3.1.4 元素信息3.1.5 …

lintcode:买卖股票的最佳时机 III

买卖股票的最佳时机 III 假设你有一个数组&#xff0c;它的第i个元素是一支给定的股票在第i天的价格。设计一个算法来找到最大的利润。你最多可以完成两笔交易。 样例 给出一个样例数组 [4,4,6,1,1,4,2,5], 返回 6 解题 尝试参考买卖股票的最佳时机 II 提交运行发现错误&#…

团队项目计划BACKLOG

团队名称&#xff1a; 铁大老司机 团队成员&#xff1a; 组长&#xff1a;杨超群 组员&#xff1a;杨涛 杜文星 张家军 计划会议过程&#xff1a; 我们小组在周三下午进行了团队会议&#xff0c;会议召开在图书馆大厅&#xff0c;主要内容是进行项目的总体计划安排&#xff0…

C++从0到1的入门级教学(八)——通讯录管理系统

文章目录8 通讯录管理系统8.1 系统需求8.2 菜单功能8.3 退出功能8.4 添加联系人8.4.1 设计联系人结构体8.4.2 设计通讯录结构体8.4.3 main函数中创建通讯录8.4.4 封装添加联系人函数8.5 显示联系人8.5.1 封装显示联系人函数8.5.2 调用显示联系人函数8.6 删除联系人8.6.1 封装检…

【Data Cluster】真机环境下MySQL数据库集群搭建

真机环境下MySQL-Cluster搭建文档 MySQL Cluster简介 MySQL cluster 和 Oracle RAC 完全不同&#xff0c;它采用 无共享架构Shared nothing&#xff08;shared nothing architecture&#xff09;。整个集群由管理节点(ndb_mgmd)&#xff0c;处理节点(mysqld)和存储节点(ndbd)组…

数据结构杂谈(八)——树(上)

文章目录8 树(上)8.1 引入8.2 树的基础知识8.3 树的存储结构8.3.1 双亲表示法8.3.2 孩子表示法8.4 二叉树8.4.1 基础知识8.4.2 高频考点8.4.3 二叉树的性质8.4.4 二叉链表8.4.5 树和二叉树的转换8.4.6 森林和二叉树的转换8.5 遍历8 树(上) 8.1 引入 我们在前面的章节中一直在…

Maven(一)——快速上手Maven

文章目录Maven概述Maven简介Maven的安装Maven的基本使用IDEA配置Maven依赖管理依赖范围Maven概述 Maven是专门用于管理和构建Java项目的工具&#xff0c;它的主要功能有&#xff1a; &#xff08;一&#xff09;提供了一套标准化的项目结构 不同的IDE项目结构是不一样的&…

EntityFramework_MVC4中EF5 新手入门教程之三 ---3.排序、 筛选和分页

在前面的教程你实施了一套基本的 CRUD 操作&#xff0c;为Student实体的 web 页。在本教程中&#xff0c;您将添加排序、 筛选和分页到 StudentsIndex的功能。您还将创建一个页面&#xff0c;并简单分组。 下面的插图显示页面当你完成时的样子。列标题是链接&#xff0c;用户可…

fluentd主从配置

fluentd是一个免费的、完全开源的日志管理工具&#xff0c;可以对日志进行收集、处理、存储。对于一些高流量的网站或者特殊的架构&#xff0c;需要fluentd高可用配置。 以下是在测试环境搭建模拟fluentd主从配置&#xff0c;模拟主从切换。 服务器 服务 192.168.199.1 elas…

Hadoop总结

目录 大数据概述 Hadoop大数据开发平台 资源管理YARN 分布式文件系统HDFS 非关系型数据库NOSQL 分布式数据库HBASE 批处理和MapReduce 数据仓库查询分析和Hive 基于内存计算的Spark 流计算和Flink 图计算和PREGEL Hadoop常用命令总结 大数据概述 大数据的4V&#x…

HDFS的常用操作

1、HDFS文件的权限以及读写操作 HDFS文件的权限&#xff1a; •与Linux文件权限类似 •r: read; w:write; x:execute&#xff0c;权限x对于文件忽略&#xff0c;对于文件夹表示是否允许访问其内容 •如果Linux系统用户zhangsan使用hadoop命令创建一个文件&#xff0c;那么这个文…

并行计算总结

作者&#xff1a;ArimaMisaki 目录 1 并行计算概述. 2 1.1 基本概念. 2 1.2 存储器的层次结构. 3 1.3 并行计算. 3 1.4 动态互连网络. 4 1.5 并行计算机结构模型. 5 1.6 并行算法的基本设计策略. 6 1.7 并行编程风范. 6 1.8 单核多线程和并发执行. 7 1.9 拓展&#x…

基础总结篇之中的一个:Activity生命周期

子曰&#xff1a;溫故而知新&#xff0c;能够為師矣。《論語》 学习技术也一样&#xff0c;对于技术文档或者经典的技术书籍来说&#xff0c;指望看一遍就全然掌握&#xff0c;那基本不大可能&#xff0c;所以我们须要常常回过头再细致研读几遍&#xff0c;以领悟到作者的思想精…

数据结构杂谈(九)——二叉树的遍历

9 二叉树的遍历 文章目录9 二叉树的遍历9.1 递归函数基础9.2 深度优先遍历的实现9.3 二叉树层次遍历9.1 递归函数基础 什么是递归&#xff1f;调用自身就是叫递归&#xff0c;如下所示&#xff1a; void r(){r(); }我们习惯借用阶梯图来帮助我们理解这些知识。如果是同一层函数…

洛谷 P3750 [六省联考2017]分手是祝愿

传送门 题解 //Achen #include<algorithm> #include<iostream> #include<cstring> #include<cstdlib> #include<vector> #include<cstdio> #include<queue> #include<cmath> const int N100000,mod100003; #define For(i,a,b)…