iOS证书相关概念详解

关于开发证书配置(Certificates&Identifiers&Provisioning Profiles),相信做iOS开发的同学没少被折腾,本文将对相关概念做个系统的梳理。

在进行iOS证书申请之前,假设你使用过Apple设备且注册过Apple ID。首先,必须加入苹果开发者计划(Enrollin
iOS Developer Program to become a member),分为Individual和Company/Organization两种类型。

下文主要基于个人开发者账号(Individual):$99/Year。

.证书(Certificates)

顾名思义,证书是用来证明内容(App的CodeSign)的合法性和完整性的。对于发布到AppStore/安装到真机的应用程序(App),只有经过签名验证(CodeSign)才能确保来源可信,并且保证代码是完整、未经篡改的。

证书分为两类:Development和Production(Distribution)。

  • Development证书用来开发和调试应用程序;
  • Production主要用来分发应用程序(根据证书种类有不同作用)。

下文主要针对开发调试阶段的Development证书。

.App ID(bundle
identifier)

App ID用于标识一个或者一组App,AppID应该是和Xcode中的Bundle Identifier是一致的或者匹配的。

App ID字符串通常是反域名(reverse-domain-name)格式的CompanyIdentifier(Company ID)作为前缀(Prefix/Seed)。

App ID分为两类:

  • Explicit App ID:唯一的App ID,这种App ID用于唯一标识一个应用程序。例如“com.apple.garageband”这个App
    ID,用于标识Bundle Identifier为“com.apple.garageband”的程序。
  • Wildcard App ID:通配符App ID,用于标识一组应用程序。例如“*”表示所有应用程序;而“com.apple.*”可以表示以“com.apple.”开头的所有应用程序。

.设备(Device)

Device就是运行iOS系统用于开发调试iOS App的设备,每台设备使用UDID来唯一标识。iOS设备连接Mac后,可通过iTunes->Summary或者Xcode->Window->Devices获取iPhone的UDID(identifier)。

Devices中包含了该账户中所有可用于开发和测试的设备,普通个人开发账号每年最多只能注册100个设备。

  • Apps signed by you or your team run only on designated development devices.
  • Apps run only on the test devices you specify.

.供应配置文件(Provisioning
Profiles

Provisioning Profile文件包含了上述的所有内容:证书、App ID、设备。它决定Xcode用哪个证书(公钥)/私钥组合(KeyPair)来签署应用程序(Signing Product),将在应用程序打包时嵌入到.ipa包里。安装应用程序时,Provisioning
Profile文件被拷贝到iOS设备中,运行该iOS App的设备也通过它来认证安装的程序。

如果要打包或者在真机上运行一个APP,一般要经历以下三步:

  • 首先,需要证书来进行签名,用于标识这个APP是合法、安全、完整的;
  • 其次,需要指明它的App ID,并且验证Bundle ID是否与其一致;
  • 然后,如果是真机调试,需要确认这台设备是否授权运行该APP。

Provisioning Profile把这些信息全部打包在一起,方便我们在调试和发布程序打包时使用。这样,只要在不同的情况下选择不同的ProvisioningProfile文件就可以了。

Provisioning Profile也分为Development和Distribution两类,有效期同Certificate一样。

.开发组供应配置文件(Team
Provisioning Profiles

Xcode3.2.3预发布版本中加入了Team ProvisioningProfile这项新功能。

在Xcode中添加Apple Developer Account时,它将与Apple Dev Center后台勾兑自动生成iOSTeamProvisioning Profile(Managed by Xcode)。

Team Provisioning Profile包含一个为Xcode iOS Wildcard App ID(*)生成的iOS Team Provisioning Profile:*(匹配所有应用程序),账户里所有的Development Certificates和Devices都可以使用它在这个eam注册的所有设备上调试所有的应用程序(不管bundleidentifier是什么)。同时,它还会为开发者自己创建的Wildcard/Explicit
App IDs创建对应的iOSTeam Provisioning Profile。

Team Provisioning Profile生成/更新时机:

  • (1).Add an Apple ID account to Xcode
  • (2).Fix issue "No Provisioning Profiles with a valid signingidentity" in Xcode
  • (3).Assign Your App to a Team in Xcode project settings ofGeneral|Identity
  • (4).Register new device on the apple development website or Xcodedetected new device connected

利用Xcode生成和管理的iOS Team Provisioning Profile来进行开发非常方便,可以不需要上网站手动生成下载Provisioning Profile。

.App Group

WWDC14除了发布了OS X v10.10和switf外,iOS 8.0也开始变得更加开放了。说到开放,当然要数应用扩展(AppExtension)了。顾名思义,应用扩展允许开发者扩展应用的自定义功能和内容,能够让用户在使用其他应用程序时使用该项功能,从而实现各个应用程序间的功能和资源共享。可以将扩展理解为一个轻量级(nimbleand
lightweight)的分身。

扩展和其Containing App各自拥有自己的沙盒,虽然扩展以插件形式内嵌在ContainingApp中,但是它们是独立的二进制包,不可以互访彼此的沙盒。为了实现Containing App与扩展的数据共享,苹果在iOS
8中引入了一个新的概念——App Group,它主要用于同一Group下的APP实现数据共享,具体来说是通过以App Group ID标识的共享资源区——App Group Container。

置于同一App Group下的一组AppIDs必须是唯一的(Explicit),并且ContainingApp与Extension的App ID命名必须符合规范。一般Extension的App ID以Containing App为Seed,假如Garageband这个App(App
ID=“com.apple.garageband”),则支持从语音备忘录导入到Garageband应用的插件的AppID可能形如“com.apple.garageband.extImportRecording”。

.证书与签名(Certificate&
Signature)

通过Keychain证书助理手动申请开发证书时(也可通过Xcode自动请求生成),keychain将生成一个包含开发者身份信息的CSR(Certificate Signing Request)文件,Keychain Access|Keys中将新增一对Public/Private Key
Pair

在Apple开发网站上传该CSR文件,Apple证书颁发机构WWDRCA(Apple Worldwide Developer Relations Certification Authority)将使用WWDR private key对CSR中的publick key进行加密签名生成数字证书(ios_development.cer)。

下载证书到Mac上双击安装后,在KeychainAccess|Keys中展开CSR生成Key Pair中的私钥前面的箭头,可以查看到包含其对应公钥的证书(Your requested certificate will bethe public half of the key pair.);在KeychainAccess|Certificates中展开安装的证书(ios_development.cer)前面的箭头,可以看到其对应的私钥。

每个证书(其实是公钥)对应的私钥会被用来对内容(executable
code,resources such as images and nib files aren’t signed)进行数字签名(CodeSign)——使用哈希算法生成内容摘要(digest)。上面已经提到,公钥被包含在数字证书里,数字证书又被包含在描述文件(ProvisioningFile)中,描述文件在应用被安装的时候会被拷贝到iOS设备中。

另一方面,iOS系统以及MacOS X系统(在安装Xcode时)将自动安装AppleWWDRCA.cer这个Intermediate
Certificates
。如果Mac Keychain Access证书助理在申请证书时尚未安装过该证书,请先下载安装。iOS/Mac机上的ios_development.cer可以被AppleWWDRCA.cer中的 public key解密,从而获取每个开发证书中可信任的公钥。

iOS/Mac设备(系统)使用AppProvisioning Profile证书中的公钥来判断App代码签名的合法性:

  • (1)若用公钥能成功解密得到内容摘要,证明此内容确乃认证开发者发布,即来源可信;
  • (2)再对内容本身使用哈希算法计算摘要,若与上一步得到的摘要一致,则证明内容未被篡改过,即内容可信。

.在多台机器上实现开发账户/证书共享

若在Xcode Preferences添加了该Accounts,选中Team条目|ViewDetails:可以查看Signing Identities和ProvisioningProfiles。

  • 选中欲导出的Account,点击+-之后的?|ExportAccounts,可导出包含account/code signingidentity/provisioning profiles信息的*.developerprofile(Exporting a Developer Profile)文件供其他机器上的Xcode开发使用(Import该Account)。
  • 选中欲导出的Signing Identity条目,点击栏底+之后的?|Export,必须输入密码,并需授权exportkey "privateKey" from keychain,将导出Certificates.p12或在Keychain
    Access|Certificates中选中欲导出的certificate或其下private key,右键Export或者通过菜单File|Export Items导出Certificates.p12

其他Mac机器上双击Certificates.p12(如有密码需输入密码)即可安装该共享证书,在开发者网站上将欲调试的iOS设备注册到该开发者账号名下,并下载对应证书授权了iOS调试设备的Provisioning Profile文件即可在iOS真机设备上开发调试。

参考:

iPhone真机调试应用程序》《iOS
Developer:真机测试

关于Certificate、Provisioning Profile、App ID的介绍及其关系

iOS Development--Certificates, Provisioning
Profiles

数字签名和数字证书》《苹果开发者账号那些事儿

代码签名探析/Inside
Code Signing
》《iOS Code Signing 学习笔记

时间: 2024-10-11 13:42:56

iOS证书相关概念详解的相关文章

iOS申请发布证书-图文详解(转载)

本文讲述发布证书的申请,申请真机调试证书请参考:http://my.oschina.net/joanfen/blog/167730 首先登陆https://developer.apple.com(99美元账号) 选择iOS Developer program 板块下的 Certificates,Identifiers & Profiles 点击进入 b.进入 c.选择证书类型 distribution,选择添加 d.点击+后,选择distribution->App Store and Ad

iOS申请发布证书-图文详解

首先登陆https://developer.apple.com 选择iOS Developer program 板块下的 Certificates,Identifiers & Profiles 点击进入 b.进入 c.选择证书类型 distribution,选择添加 d.点击+后,选择distribution->App Store and Ad Hoc,continue PS:现在的itunes已经将这两项分开,要上传至AppStore请选择App Store,如果是要安装到一台或多台设备上

DNS服务相关概念详解

实验环境:RHEL 32Bit DNS服务相关概念详解 DNS是一种域名解析服务,DNS服务的核心以及DNS服务的标准都是基于一个软件来实现的,这个软件叫做BIND(Berkeley Internet Name Domain),互联网上几乎所有的DNS服务都是由BIND来构建的,虽然也有其它的DNS服务构建标准,但是它们的使用语法以及工作机制都和BIND非常接近. ·Linux服务器和Windows服务器的比较 Linux服务器在没有SELinux的时候它的安全级别和Windows服务器的安全级

转:iOS中socket详解

一.网络各个协议:TCP/IP.SOCKET.HTTP等 网络七层由下往上分别为物理层.数据链路层.网络层.传输层.会话层.表示层和应用层. 其中物理层.数据链路层和网络层通常被称作媒体层,是网络工程师所研究的对象: 传输层.会话层.表示层和应用层则被称作主机层,是用户所面向和关心的内容. http协议   对应于应用层 tcp协议    对应于传输层 ip协议     对应于网络层 三者本质上没有可比性.  何况HTTP协议是基于TCP连接的. TCP/IP是传输层协议,主要解决数据如何在网络

iOS UIView动画详解(Objective-C)

我在之前的一篇博客中<iOS UIView动画详解(Swift)>讲解了使用Swift来实现UIView类下面提供的多种动画效果,如位置动画.旋转动画.缩放动画.颜色动画.透明度动画等等.为了这个题目的完整性,今天我使用Objective-C来完全重写以上的所有的动画.项目案例已经上传至:https://github.com/chenyufeng1991/iOS-UIView-Animation  中的Animation-OC文件夹下,另一个目录下则是Swift实现的动画. (1)位置动画 P

iOS开发:详解Objective-C runTime

Objective-C总Runtime的那点事儿(一)消息机制 最近在找工作,Objective-C中的Runtime是经常被问到的一个问题,几乎是面试大公司必问的一个问题.当然还有一些其他问题也几乎必问,例如:RunLoop,Block,内存管理等.其他的问题如果有机会我会在其他文章中介绍. 本篇文章主要介绍RunTime. RunTime简称运行时.就是系统在运行的时候的一些机制,其中最主要的是消息机制.对于C语言,函数的调用在编译的时候会决定调用哪个函数( C语言的函数调用请看这里 ).编

iOS开发 - UIActivityViewController详解

昨天在做微信分享的时候, 用到了这个东西.趁热写点东西记录下. UIActivityViewController类是一个标准的view controller,通个使用这个controller,你的应用程序就可以提供各种服务. 系统提供了一些通用的标准服务,例如拷贝内容至粘贴板.发布一个公告至社交网.通过email或者SMS发送内容. 应用程序同样可以自定义服务.(我的微信分享就属于自定义服务, 之后将会写一篇教程介绍) 你的应用程序负责配置.展现和解雇这个view controller. vie

转载]IOS LBS功能详解[0](获取经纬度)[1](获取当前地理位置文本 )

原文地址:IOS LBS功能详解[0](获取经纬度)[1](获取当前地理位置文本作者:佐佐木小次郎 因为最近项目上要用有关LBS的功能.于是我便做一下预研. 一般说来LBS功能一般分为两块:一块是地理定位,就是获取当前精度.纬度和地理位置的功能,这一部分功能主要用到CoreLocation.Frameworks.一部分就是显示地图信息.丰富地图内容等,这一部分主要用到MapKit.Frameworks.以上这几个功能的测试最好都要在真机上进行.模拟器上定位一般会在Apple的加州总部. 首先介绍

IOS开发 Blocks详解(转)

IOS开发 Blocks详解(转) (2013-10-14 16:41:54) 从Mac OS X 10.6以及iOS 4开始,苹果在GCC和Clang编译器中为C语言引入了一个新扩展:Blocks,使得程序员可以在C.Objective-C.C++和Objective-C中使用闭包.Blocks有点像函数,但是它可以在其它函数或方法中进行声明和定义,同时它还是匿名的(匿名函数),并可以捕获其所在作用域中的变量(闭包特性). Blocks的语法 Blocks和C语言中的函数指针有点类似,如果你了