iOS Code Signing: 解惑详解

Iphone开发的代码签名

 

英文版链接:

http://developer.apple.com/iphone/gettingstarted/docs/signingcodeforiphonedev.action

 

代码签名确保代码的真实以及明确识别代码的来源。在代码运行在一个开发系统以前,以及在代码提交到Apple发布以前,Apple要求所有的的应用程序都必须进行数字签名。另外,Apple在发布每一个应用程序之前都要添加他自己的数字签名。

数字签名和签名标识

Apple要求所有的iphone应用程序都需要使用apple提供给已注册的iphone开发者的签名许可进行数字签名。这个签名证明了该应用程序开发者的身份以及确保这个应用程序在签名以后没有被修改或者篡改过。

数字签名使用两种截然不同的方式,即:众所周的公有密钥和私有密钥的算数关系加密术。私有密钥使用在签名的过程中。公有密钥用来验证这个签名的有效性。公有签名被存储在签名证书中,而私有签名被单独的存储,这种证书和算数加密结合的私有密钥被叫做数字标识或者签名标识。

为iphone开发获取签名标识,你需要使用Keychain Access utility里边的Certificate Assistant来创建一个签名许可请求Certificate Signing Request (CSR),你提交这个请求是希望得到使用iphone开发者计划的计划入口的正式许可。当你的请求被正式批准以后,下载这个证书文件,双击这个文件,就可以将其安装到你的keychain(密钥链中),在你使用Certificate Assistant utility生成一个签名许可请求Certificate
Signing Request (CSR)的过程中,这些你可能看得不太明显,因为它自动生成了一对共有-私有密钥。它包括发送给apple的许可请求中的公有密钥(public key)和存储在你的密钥链(keychain)中的私有密钥(private key)。

当你下载安装签名许可的时候, Keychain Access utility将其与私有密钥关联,以创建签名标识。打开 Keychain Access utility 点击 Category面板下的My Certificates 以察看许可的关联私有密钥。

当你安装了已签名的应用程序到你的iphone上去的时候,iphone OS 将要验证签名以确保该应用程序已签名并在签名以后未被篡改。如果签名无效或者你根本就没有签名,iphone OS 将不允许该应用程序运行。

同样,当你提交你的应用程序给apple 审批和部署的时候,首先,你必须用你的签名标识为你的应用程序签名,同时随程序一起提交你的签名证书。(私有密钥不用提交至apple。)然后 Apple验证该程序代码是否来自有效的已注册的开发者。 最后 Apple用她自己的签名证书为你的已签名的应用程序签名。然后你的应用程序才能够在iPhone ,iPod Touch上正常的运行。这种机制确保这些设备的拥有者从iTunes上边下载的那些已注册的开发者所编写的应用程序的安全性,并且这些应用程序没有被修改过。

将签名标识复制到其他机器

如果你用来开发的机器不只一台(例如,办公电脑和你的家用笔记本电脑),你需要在两台上边都有你的签名标识。因为你从 程序门户网站(Program Portal)上边下载的签名许可文件不包括你的私有密钥,仅仅将这个签名许可文件复制到你的另一台电脑上是不够的。你需要使用 Keychain Access 导出一个个人信息替换文件( Personal Information Exchange ),具体操作步骤如下 打开 Keychain Access,选择 文件,导出项,(Keychain Access-> File->
Export Items )导出许可和私有密钥作为你的个人信息替换文件,将其复制到另一台机器上,双击这个文件将许可和密钥导入到keychain下即可。

保持你的私有密钥安全有效

只要你持有签名标识,尤其是你的私有密钥,这个系统将是非常安全的。然而如果有任何未经授权的人使用了你的签名许可和私有密钥,他们可以修改你的应用程序并且可以为这些修改代码申请签名,或者他们也可以以你的身份写他们自己的应用程序。因此你的私有密钥的自身安全是防止你的软件和标识被恶意使用的最基本的手段。

在你获取签名标识和处理代码签名之前,你必须要确定你公司内谁将拥有这个标识,谁使用这个标识,以及如何保证这个标识的安全性。例如,如果这个标识一定是多人使用,你可以将其放置在一台比较安全的电脑的keychain中,并且为keychain分配一个核实用户身份用的密码,或者你也可以将这个密钥放置在一个用户有PIN码的smart卡中。

默认情况下,你的Keychain密码和你的机器登陆密码是相同的,并且只要你登陆到你的机器当中,keychain将保持解锁状态。这就等同于你将你的车钥匙放在了后门旁边的桌子上,并且后门整天都不上锁。如果只有钥匙能开你的车的话,你没有有效的保护你的车钥匙,怎么能保证你的车的安全呢?

为了保证签名标识的安全,以及其他一些keychain下的有价值的秘密信息的安全性,你至少应该采取如下措施:

  • 设置你的keychain在不使用的情况下自动加锁:在 Keychain Access utility下,选择Edit-> Change Settings for Keychain 并且勾选多选框(前两项就可以了)。
  • 为你的Keychain使用一个不同于登陆密码的密码: 在 Keychain Access utility下,选择Edit-> Change Password 来改变 Keychain 的密码。在改变密码对话框中勾选加锁图标来获取密码助手。要确保记住你修改后的密码,并且不要随便写下你的密码。另外,钥保证你的电脑的物理安全,防止未授权的人员使用你的电脑。

像其他重要的数据一样,你最好将签名标识备份到一个安全的地方。你可以将其放到其他机器的keychain中,或者以个人信息替换文件( Personal Information Exchange (.p12) file )的方式存到一张加密的CD或者加密的硬盘镜像中。确认你所使用的密码都是健壮的,并且拥有签名许可的电脑的物理安全(尽量不要允许未信任的人员使用他们)。

从哪里开始?

iPhone Developer Program 网站上有详细的获取和安装签名标识的规程,点击 iPhone DevCenter 页右上角的网站图标。(你需要一个登陆进去,这个连接才会有效。)

获取更多关于数字签名,加密密钥以及证书许可等信息,请访问 Security Overview and Code
Signing Guide
.

Security Overview

http://developer.apple.com/documentation/Security/Conceptual/Security_Overview/Introduction/chapter_1_section_1.html

Code Signing Guide

http://developer.apple.com/documentation/Security/Conceptual/CodeSigningGuide/Introduction/chapter_1_section_1.html

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

教程截图:

    下面是一篇有澳洲墨尔本的一名全职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,你可以看到这样一个菜单。

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

  这里你可以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绘制了一个图表,用来描述这些对象之间的关系。

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

 

私钥 Private Key:

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

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

(这是私隐,要加码的)

  如果你没有看到任何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:

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

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

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

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

  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。如下图。

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

Provisioning Profile

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

  ·App ID (app的唯一标识)

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

  ·Certificate (开发者认证)

  就是所谓的Provisioning Profile。

 

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

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

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

  ·为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。

时间: 2024-10-03 12:29:19

iOS Code Signing: 解惑详解的相关文章

iOS开发UIScrollView使用详解

iOS开发UIScrollView使用详解 一.ScrollView常用方法和属性 @property(nonatomic)CGPoint contentOffset; 设置滚动的偏移量 @property(nonatomic)CGSize contentSize; 设置滑动区域 @property(nonatomic,assign) id<UIScrollViewDelegate>      delegate; 设置UIScrollView的代理 @property(nonatomic,ge

IOS React Native FlexBox详解及实例_IOS

IOS React Native FlexBox详解及资料整理, # 前言 学习本系列内容需要具备一定 HTML 开发基础,没有基础的朋友可以先转至 HTML 学习 本人接触 React Native 时间并不是特别长,所以对其中的内容和性质了解可能会有所偏差,在学习中如果有错会及时修改内容,也欢迎万能的朋友们批评指出,谢谢 文章第一版出自简书,如果出现图片或页面显示问题,烦请转至 简书 查看 也希望喜欢的朋友可以点赞,谢谢 什么是 FlexBox 布局 在 html 中,界面的搭建都是采用 C

Android开发实现带有反弹效果仿IOS反弹scrollview教程详解_Android

首先给大家看一下我们今天这个最终实现的效果图:   这个是ios中的反弹效果.当然我们安卓中如果想要实现这种效果,感觉不会那么生硬,滚动到底部或者顶部的时候.当然 使用scrollview是无法实现的.所以我们需要新建一个view继承ScrollView package davidbouncescrollview.qq986945193.com.davidbouncescrollview; import android.annotation.SuppressLint; import androi

iOS UITableView代理方法详解

IOS UITableView的代理方法详解 一.补充 在上一篇博客中,http://my.oschina.net/u/2340880/blog/404605,我将IOS中tableView(表视图)的一些常用方法总结了一下,这篇将tableView的代理方法作了总结,对上一篇博客进行了补充. 二.UITableViewDataSourc(数据源代理) 1.必须实现的回调方法 返回每个分区的行数 - (NSInteger)tableView:(UITableView *)tableView nu

IOS中UIActionSheet使用详解

IOS中UIActionSheet使用方法详解 一.初始化方法 - (instancetype)initWithTitle:(NSString *)title delegate:(id<UIActionSheetDelegate>)delegate cancelButtonTitle:(NSString *)cancelButtonTitle destructiveButtonTitle:(NSString *)destructiveButtonTitle otherButtonTitles:

iOS开发 widget构建详解及实现代码_IOS

iOS开发之widget实现 前言     iOS extension的出现,方便了用户查看应用的服务,比如用户可以在Today的widgets中查看应用的简略信息,然后点击进入相关的应用界面. 暂且不表网络上现有的widget文章,本篇文章主要说明本人具体实现widget的步骤,希望能够帮助到需要实现widget的同行朋友. 图1 Today的widget展示----以支付宝为例说明 文章将依次从以下几个问题着手,进行详细说明:1.如何为现有的工程添加widget:2.如何绘制UI:3.如何调

iOS 雷达效果实例详解_IOS

iOS雷达效果 这段时间新app开始了,有个产品需求是做一个类似如下效果的雷达图: 中间的图片是用户头像,然后需要展示一个雷达扫描的效果. 分析下雷达图的大致构成: 底部一个呈现用户头像的UIImageView 几个颜色渐变的同心圆,这些同心圆. 只需要在雷达视图的drawRect方法里画就可以了 盖在最上层的一个扇形,且扇形的圆心和雷达图视图的圆心是同一个点.扫描效果就是让这个扇形绕圆心转,因此把这个扇形抽成一个单独的类比较好. 同时这个雷达图应该提供两个接口:开始动画,暂停动画.因此雷达图的

IOS中Tagged Pointer详解

前言 在2013年9月,苹果推出了iPhone5s,与此同时,iPhone5s配备了首个采用64位架构的A7双核处理器,为了节省内存和提高执行效率,苹果提出了Tagged Pointer的概念.对于64位程序,引入Tagged Pointer后,相关逻辑能减少一半的内存占用,以及3倍的访问速度提升,100倍的创建.销毁速度提升.本文从Tagged Pointer试图解决的问题入手,带领读者理解Tagged Pointer的实现细节和优势,最后指出了使用时的注意事项. 问题 我们先看看原有的对象为

iOS 7新功能详解

尽管消费者对于苹果旗下最新移动操作系统已经足足等待了三个月之久,但这一备受期待的系统还是在当地时间9月18日同所有消费者见面了.对于这一系统,就连苹果CEO蒂姆-库克(Tim Cook)都将其称为是"自iPhone问世以来,iOS所迎来的最大一次改变."iOS 7的系统设计由苹果高级副总裁乔纳森-艾维(Jony Ive)担纲,自从苹果在2012年进行了高管重组后,艾维便替代了此前斯科特-福斯特尔(Scott Forstall)的位置开始全面负责iOS系统的用户界面设计工作. 1. 查看