您好,欢迎来到二三娱乐。
搜索
您的当前位置:首页iOS-Provisioning Profile(Certifi

iOS-Provisioning Profile(Certifi

来源:二三娱乐

引言

  1. 什么是App ID?Explicit/Wildcard App ID有何区别?什么是App Group ID?
  2. 什么是证书(Certificate)?如何申请?有啥用?
  • 什么是Key Pair(公钥/私钥)?有啥用?与证书有何关联?
  • 什么是签名(Signature)?如何签名(CodeSign)?怎样校验(Verify)?
  • 什么是(Team)Provisioning Profiles?有啥用?
  • Xcode如何配置才能使用iOS真机进行开发调试?
  • 多台机器如何共享开发者账号或证书?
  • 遇到证书配置问题怎么办?
  • Xcode 7免证书调试真机调试

写在前面

  1. 若要真机调试实践,你必须至少拥有一台装有 Mac OS X/Xcode 的 Mac 开发机(iMac or MacBook),其上自带原生的 Keychain Access。

一. App ID(bundle identifier)

用户可在 Developer Member Center 网站上注册(Register)或删除(Delete)已注册的 App IDs。
App ID 被配置到【XcodeTarget|Info|Bundle Identifier】下;对于 Wildcard App ID,只要 bundle identifier 包含其作为 Prefix/Seed 即可。

二. 设备(Device)

用户可在网站上注册或启用/禁用(Enable/Disable)已注册的Device。
本文的 Devices 是指**连接到 **Xcode 被授权用于开发测试的iOS设备(iPhone/iPad)。

三.开发证书(Certificates)

  1. 证书的概念
    证书是由公证处或认证机关开具的证明资格或权力的证件,它是表明(或帮助断定)事理的一个凭证。证件或凭证的尾部通常会烙印公章
    每个中国人一生可能需要70多个证件,含15种身份证明。证件中“必需的”有30到40个。将这些证件按时间顺序铺开,那就是一个天朝子民的一生——持准生证许可落地,以户籍证明入籍,以身份证认证身份,持结婚证以合法同居,最终以死亡证明注销。
  2. 数字证书的概念
    数字证书就是互联网通讯中标志通讯各方身份信息的一串数字,提供了一种在 Internet 上验证通信实体身份的方式,其作用类似于司机的驾驶执照或日常生活中的身份证。它是由一个由权威机构——CA机构(CA = Certificate Authority),又称为数字证书授权中心(数字证书认证机构)颁发(发行)的,人们可以在网上用它来识别对方的身份。数字证书是一个经 CA 数字签名的包含公开密钥拥有者信息以及公开密钥的文件。最简单的证书包含一个公开密钥、名称以及 CA 的数字签名。
    数字证书还有一个重要的特征就是时效性:只在特定的时间段内有效。
    数字证书中的公开密钥(公钥)相当于公章。
    证书的信任链条是环环相扣的,根证书就是一开始就被信任的证书,是信任链的起始点
    在天朝子民的一生中,户籍证明可理解为等效的根证书:有了户籍证明,才能办理身份证;有了上流的身份证,才能办理下游居住证、结婚证、计划生育证、驾驶执照等认证。
  3. 根证书的概念
    根证书是被严格限制和确认的,根证书的颁发者被称之为 Root Certificate Authority(Root CA)。
    某一认证领域内的根证书是 CA 认证中心给自己颁发的证书(自行签名),安装根证书意味着对这个 CA 认证中心的信任。
    那么由谁来保证信任链起点的安全呢?
    现代网络都会内置一份可信的根证书列表(Firefox 的根证书列表独立于操作系统之外)。
    所谓“可信的根证书列表”是指操作系统开发商通过严格地审核,将安全可靠、可被信任的 CA 机构纳入白名单,并将这些权威可信 CA 的根证书预安装到操作系统中。
  4. Windows Internet Explorer 中,通过菜单【工具 | Internet 选项 | 内容 | 证书】可以查看受信任的根证书颁发机构(或中间证书颁发机构):
  5. macOS Keychain Access 中,可查看系统根证书(或系统证书):
  • 常见的权威 CA 根证书有:

AddTrust External CA Root(The USERTrust Network™)
Baltimore CyberTrust Root(DigiCert Baltimore Root)
DigiCert Global Root CA(DigiCert)
DigiCert High Assurance EV Root CA(DigiCert)
DST Root CA X3
GeoTrust Global CA
GeoTrust Primary Certification Authority
GlobalSign(颁发者:GlobalSign Root CA - R3;签名算法:sha256RSA——带 RSA 加密的 SHA-256)
GlobalSign(颁发者:GlobalSign Root CA - R2;签名算法:sha1RSA——带 RSA 加密的 SHA-1)
GlobalSign Root CA(组织:GlobalSign nv-sa)
Go Daddy Class 2 Certification Authority(组织:The Go Daddy Group, Inc.)
Go Daddy Root Certificate Authority -  Inc.)
QuoVadis Root Certification Authority(组织:QuoVadis Limited)
Starfield Class 2 Certification Authority
Starfield Services Root Certificate Authority( - G2)(组织:Starfield Technologies, Inc.)
StartCom Certification Authority(签名算法:sha1RSA——带 RSA 加密的 SHA-1)
thawte Primary Root CA
thawte Primary Root CA - G3
UTN-USERFirst-Object(组织:The USERTRUST Network)
VeriSign Universal Root Certification Authority(组织单位:VeriSign Trust Network)
VeriSign Class 3 Public Primary Certification Authority - G5(组织单位:VeriSign Trust Network)
  • Windows 下微软颁发的证书:

Microsoft Root Authority
Microsoft Root Certificate Authority
Symantec Enterprise Mobile Root for Microsoft
  • macOS 下苹果颁发的证书:

Apple Root CA
Apple Root Certificate Authority
Developer ID Certification Authority(系统根证书)
Apple Worldwide Developer Relations Certification Authority(系统证书)
  • 椭圆曲线公共密钥:

    • 签名算法:带 SHA-256 的 ECDSA 签名;公共密钥算法:椭圆曲线公共密钥;参数为[椭圆曲线 secp256r1]
    • 签名算法:带 SHA-384 的 ECDSA 签名;公共密钥算法:椭圆曲线公共密钥;参数为[椭圆曲线 secp384r1]
  • macOS 预装了 Apple Root CA、GlobalSign、GeoTrust、Symantec、thawte、VeriSign 等权威机构的包含椭圆曲线公共密钥的根证书:

    • GlobalSign(组织单位:GlobalSign ECC Root CA - R4;带 SHA-256 的 ECDSA 签名)
    • GlobalSign(组织单位:GlobalSign ECC Root CA - R5;带 SHA-384 的 ECDSA 签名)
    • Apple Root CA - G3(组织单位:Apple Certification Authority;带 SHA-384 的 ECDSA 签名)
    • GeoTrust Primary Certification Authority - G2(组织:GeoTrust Inc.;带 SHA-384 的 ECDSA 签名)
    • Symantec Class 1/2/3 Public Primary Certification Authority - G4(组织单位:Symantec Trust Network;带 SHA-384 的 ECDSA 签名)
    • thawte Primary Root CA - G2(组织:thawte, Inc.;带 SHA-384 的 ECDSA 签名)
    • VeriSign Class 3 Public Primary Certification Authority - G4(组织单位:VeriSign Trust Network;带 SHA-384 的 ECDSA 签名)
    • 为了防止 进行中间人攻击(MitM),例如篡改 证书,导致无法访问 github 网站等问题,可选择不信任 :
    • 在[钥匙串-系统]中双击 ,在【信任】|【使用此证书时】下拉选择【永不信任】。
  1. iOS(开发)证书
    iOS 证书是用来证明 iOS App 内容(bundle with executable and resources)的合法性和完整性的数字证书。对于想安装到真机或发布到 AppStore 的应用程序(App),只有经过签名验证(Signature Validated)才能确保来源可信,并且保证 App 内容是完整、未经篡改的。
    iOS 证书分为两类:Development 和 Production(Distribution)。
  • Development 证书用来开发和调试应用程序:A development certificate identifies you, as a team member, in a development provisioning profile that allows apps signed by you to ***launch ***on devices.
  • Production 主要用来分发应用程序(根据证书种类有不同作用):A distribution certificate identifies your team or organization in a distribution provisioning profile and allows you to ***submit ***your app to the store. Only a team agent or an admin can create a distribution certificate.
    普通个人开发账号最多可注册 iOS Development/Distribution 证书各2个,用户可在网站上删除(Revoke)已注册的 Certificate。
    下文主要针对 iOS App 开发调试过程中的开发证书(Certificate for Development)。
  1. iOS(开发)证书的根证书
    那么,iOS 开发证书是谁颁发的呢?或者说我们是从哪个 CA 申请到用于 Xcode 开发调试 App 的证书呢?
    iOS 以及 Mac OS X 系统(在安装 Xcode 时)将自动安装 这个中间证书(Intermediate Certificates),它实际上就是 iOS(开发)证书的证书,即开发根证书
    AppleWWDRCA.cer 是由苹果公司一级认证中心 Apple Certification Authority(Apple Root CA)给下属的二级证书机构 Apple Worldwide Developer Relations Certification Authority 颁发的证书。而苹果根证书则是被默认
    预装**到 macOS 系统中的,在 Keychain Access 系统根证书中可以找到 Apple Root CA 为自己颁发的根证书。
    Apple Root CA 之于 Apple Certification Authority 好比户籍证之于身份证;AppleWWDRCA.cer 之于 iOS(开发)证书则好比身份证之于驾驶证。


    如果 Mac Keychain Access 证书助理在申请证书时尚未安装过该证书,请先下载安装(Signing requires that you have both the signing identity and the intermediate certificate installed in your keychain)。
    下载到本地后,手动点击 *.cer 安装证书到 macOS 时,Keychain Access 追溯其签发 CA 为 Apple Root CA,利用 Apple Root CA 证书公钥对其数字签名进行解密和校验。校验成功会标记此证书有效(This certificate is valid)

    二级证书路径为:
    Apple Root CA└── Apple Worldwide Developer Relations Certification Authority
  2. 申请证书(CSR:Certificate Signing Request)
    可以在缺少证书时通过 Xcode Fix Issue 自动请求证书,但是这会掩盖其中的具体流程细节。这里通过 Keychain 证书助理从证书颁发机构请求证书:填写开发账号邮件和常用名称,勾选【存储到磁盘】。

    Keychain Access|Keys 中将新增一对非对称密钥对 Public/Private Key Pair(This signing identity consists of a public-private key pair that Apple issues)。同时,keychain 将生成一个包含开发者身份信息和公钥的(Certificate Signing Request)文件——CertificateSigningRequest.certSigningRequest。

    **私钥 private key 始终保存在 Mac OS 的 Keychain Access 中,用于签名(CodeSign)本机对外发布的 App;公钥 *****public key ***一般随证书(随Provisioning Profile,随 App 安装)散布出去,对 App 签名进行校验认证。用户必须妥善保存本地 Keychain 中的 private key,以防伪冒。
    Keep a secure backup of your public-private key pair. If the private key is lost, you’ll have to create an entirely new identity to sign code.
    Worse, if someone else has your private key, that person may be able to ***impersonate ***you.

Apple Developer 开发证书颁发机构 WWDRCA* 将使用private key 对 CSR 中的 public key 和一些身份信息进行加密签名生成数字证书(ios_development.cer)并记录在案(Apple Member Center)。


从 Apple Member Center 网站
下载*证书到 Mac 上双击即可安装(当然也可在 Xcode 中添加开发账号自动同步证书和[生成]配置文件)。
手动点击 *.cer 安装证书到 macOS 时,Keychain Access 追溯其签发 CA 为AppleWWDRCA(Apple Worldwide Developer Relations Certification Authority),利用AppleWWDRCA 证书公钥对该开发证书数字签名进行解密和校验。校验成功会标记此证书有效(This certificate is valid)。
三级开发证书路径为:
Apple Root CA└── Apple Worldwide Developer Relations Certification Authority └── iPhone Developer: (**********)
在 Keychain Access 的 Login | My Certificates 可查看到安装成功的证书。

在 Keychain Access 的 Login | Keys 中展开创建 CSR 时生成的 Key Pair 中的私钥前面的箭头,可以查看到包含其对应公钥的证书(Your requested certificate will be the public half of the key pair.);在 Keychain Access|Certificates 中展开安装的证书(ios_development.cer)前面的箭头,可以看到其对应的私钥。



Certificate 应被配置到【Xcode Target|Build Settings|Code Signing|Code Signing Identity】下,下拉选择 Identities from Profile "..."(一般先配置 Provisioning Profile)。以下是 Xcode 配置示例:

四. 供应配置文件(

1. Provisioning Profile 的概念

Provisioning Profile 文件包含了上述的所有内容:证书、App ID 和 设备 ID


一个 Provisioning Profile 对应一个 Explicit App ID 或 Wildcard App ID(一组相同 Prefix/Seed 的 App IDs)。在网站上手动创建一个 Provisioning Profile 时,需要依次指定 App ID(单选)、证书(Certificates,可多选)和设备(Devices,可多选)。用户可在网站上删除(Delete)已注册的 Provisioning Profiles。
Provisioning Profile 决定 Xcode 用哪个证书(公钥)/私钥组合(Key Pair/Signing Identity)来签署应用程序(Signing Product),并将在应用程序打包时嵌入到 .ipa 包里。安装应用程序时,Provisioning Profile 文件被拷贝到 iOS 设备中,运行该 iOS App 的设备通过它来认证安装的程序。
如果要打包到真机上运行一个APP,一般要经历以下三步:
首先,需要指明它的 App ID,并且验证 Bundle ID 是否与其一致;
其次,需要证书对应的私钥来进行签名,用于标识这个 APP 是合法、安全、完整的;
然后,如果是真机调试,需要确认这台设备是否授权运行该 APP。
Provisioning Profile 把这些信息全部打包在一起,方便我们在调试和发布程序打包时使用。这样,只要在不同的情况下选择不同的 Provisioning Profile 文件就可以了。
Provisioning Profile 也分为 Development 和 Distribution 两类,有效期同 Certificate 一样。Distribution 版本的 ProvisioningProfile 主要用于提交 App Store 审核,其中不指定开发测试的Devices(0,unlimited)。App ID 为 Wildcard App ID(*)。App Store 审核通过上架后,允许所有 iOS 设备(Deployment Target)上安装运行该App。
Xcode 将全部供应配置文件(包括用户手动下载安装的和 Xcode 自动创建的 Team Provisioning Profile)放在目录 下。

2. Provisioning Profile的构成

以下为典型供应配置文件 .mobileprovision 的构成简析*:

(1)Name:该mobileprovision的文件名。
(2)UUID:该mobileprovision文件的真实文件名。
(3)TeamName:Apple ID账号名。
(4)TeamIdentifier:Team Identity。
(5)AppIDName:explicit/wildcard App ID name(ApplicationIdentifierPrefix)。
(6)ApplicationIdentifierPrefix:完整App ID的前缀(TeamIdentifier.)。
(7)
DeveloperCertificates*:包含了可以为使用该配置文件应用签名的所有证书<data><array>。

证书是基于 Base64 编码,符合 PEM(PrivacyEnhanced Mail, RFC 1848) 格式的,可使用 OpenSSL 来处理(opensslx509 -text -in file.pem)。

从 DeveloperCertificates 提取 <data></data> 之间的内容到文件 cert.cer(cert.perm):

-----BEGIN CERTIFICATE-----

将<data></data>之间的内容拷贝至此

-----END CERTIFICATE-----`

Mac 下右键 QuickLook 查看 cert.cer(cert.perm),在 Keychain Access 中右键 Get Info 查看对应证书 ios_development.cer,正常情况(公私钥 KeyPair 配对)应吻合;Windows 下没有足够信息(WWDRCA.cer),无法验证该证书。

如果你用了一个不在这个列表中的证书进行签名,无论这个证书是否有效,这个应用都将 CodeSign Fail。

(8)***Entitlements ***键<key>对应的<dict>:

keychain-access-groups:$(AppIdentifierPrefix),参见Code Signing Entitlements(*.entitlements)。

application-identifier:带前缀的全名,例如$(AppIdentifierPrefix)com.apple.garageband。

com.apple.security.application-groups:App Group ID(group. com.apple),参见Code Signing Entitlements(*.entitlements)。

com.apple.developer.team-identifier:同Team Identifier。

(9)ProvisionedDevices:该mobileprovision授权的开发设备的UDID <array>。

Provisioning Profile被配置到【XcodeTarget|Build Settings|Code Signing|Provisioning Profile】下,然后在Code Signing Identity下拉可选择Identities from Profile "..."(即Provisioning Profile中包含的Certificates)。

五. 开发组供应配置文件()**

1.Team Provisioning Profile的概念
每个 Apple 开发者账号都对应一个唯一的 Team ID,Xcode3.2.3 预发布版本中加入了 Team Provisioning Profile 这项新功能。
在 Xcode 中添加 Apple Developer Account 时,它将与 Apple Member Center 后台勾兑**自动生成 iOS Team Provisioning Profile(Managed by Xcode)。


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

2.Team Provisioning Profile 生成/更新时机
Add an Apple ID account to Xcode
Fix issue "No Provisioning Profiles with a valid signing identity" in Xcode
Assign Your App to a Team in Xcode project settings of General|Identity
Register new device on the apple development website or Xcode detected new device connected

利用 Xcode 生成和管理的 iOS Team Provisioning Profile 来进行开发非常方便,可以不需要上网站手动生成下载 Provisioning Profile。
Team Provisioning Profile 同 Provisioning Profile,只不过是由 Xcode 自动生成的,也被配置到【XcodeTarget|Build Settings|Code Signing|Provisioning Profile】下,同时需要在【XcodeTarget|General|Identity】下指定 Team 账号 ID。

六. App Group (ID)

1. App Group 的概念

2. App Group 的配置

Containing App 与 Extension 的 Explicit App ID 必须 Assign 到同一 App Group 下才能实现数据共享,并且 Containing App 与 Extension 的 App ID 命名必须符合规范:
置于同一App Group 下的 App IDs 必须是唯一的(Explicit,not Wildcard)
Extension App ID 以 Containing App ID 为前缀(Prefix/Seed)

假如 Garageband 这个 App ID 为“com.apple.garageband”,则支持从语音备忘录导入到 Garageband 应用的插件的 App ID 可能形如“com.apple.garageband.extImportRecording”。


111.png

关于Provisioning Profile,可以使用自己手动生成的,也可以使用 Xcode 自动生成的 Team Provisioning Profile。
App Group 会被配置到【Xcode Target|Build Settings|Code Signing|Code Signing Entitlements】文件(*.entitlements)的键com.apple.security.application-groups下,不影响 Provisioning Profile 生成流程。

七. (****Certificate& Signature)**

  1. Code Signing Identity




    Xcode 中配置的 Code Signing Identity(entitlements、certificate)必须与 Provisioning Profile 匹配,并且配置的 Certificate 必须在本机 Keychain Access 中存在对应 Public/Private Key Pair,否则编译会报错。
    Xcode 所在的 Mac 设备(系统)使用 CA 证书(WWDRCA.cer)来判断 Code Signing Identity 中 Certificate 的合法性:
    若用 WWDRCA 公钥能成功解密出证书并得到公钥(Public Key)和内容摘要(Signature),证明此证书确乃 AppleWWDRCA 颁布,即证书来源可信;
    再对证书本身使用哈希算法计算摘要,若与上一步得到的摘要一致,则证明此证书未被篡改过,即证书完整。

  2. Verify Code Signature with Certificate
    上面已经提到,公钥被包含在数字证书里,数字证书又被包含在描述文件(Provisioning File)中,描述文件在应用被安装的时候会被拷贝到 iOS 设备中。
    第一步,App 在 Mac/iOS 真机上启动时,需要对配置的 bundle ID、entitlements 和 certificate 与 Provisioning Profile 进行匹配校验:


    第二步,iOS/Mac 真机上的 ios_development.cer 被 AppleWWDRCA.cer 中的 public key 解密校验合法后,获取每个开发证书中可信任的公钥对 App 的可靠性和完整性进行校验。
    iOS/Mac 设备(系统)使用 App Provisioning Profile(Code Signing Identity)中的开发证书****来判断App的合法性:
    若用证书公钥能成功解密出 App(executable bundle)的内容摘要(_CodeSignature),证明此 App 确乃认证开发者发布,即来源可信;
    再对 App(executable bundle)本身使用哈希算法计算摘要,若与上一步得到的摘要一致,则证明此 App 未被篡改过,即内容完整。

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

九.

  1. no such provisioning profile was found
    Xcode Target|Genera|Identity Team下提示"Your build settings specify a provisioning profile with the UUID "xxx",howerver, no such provisioning profile was found."
    Xcode Target|BuildSettings|Code Signing|当前配置的指定UDID的provisioning profile在本地不存在,此时需要更改Provisioning Profile。必要时手动去网站下载或重新生成Provisioning Profile或直接在Xcode中Fix issue予以解决(可能自动生成iOS Team ProvisioningProfile)

  2. The app ID cannot be registered to your development team



    出现该问题通常是 app ID 冲突,即该 app ID 已经有人注册过,此时可以按照提示换一个 app ID或基于已有app ID添加后缀——Change your bundle identifier to a unique string to try again。

  3. The 'In-App Purchase' feature is only available to users enrolled in Apple Developer Program
    只有开发者账号才能真机调试 'In-App Purchase' 特性,所以需要在工程配置(Capabilities)中禁用普通Apple ID不支持的特性。


    同样,在 Xcode 8 中,也只有开发者账号才能真机调试The 'Siri' feature,否则也会报错“The 'Siri' feature is only available to users enrolled in Apple Developer Program.”而无法完成签名认证。

    解决方法
    在Xcode的 Project Navigator 中点击*.xcodeproj ,在右侧的 Targets 下选择点击目标 Target,在【】中禁用“Push Notifications”、“In-App Purchase”、“Siri”。

    如果找不到这些配置项,可尝试直接中相应feature的配置开关,步骤如下:
    关闭 Xcode 正在打开的 Project,在 Finder 中右键项目配置文件 *.xcodeproj 显示包内容,使用文本编辑器(例如 Sublime Text)打开 project.pbxproj 文件,搜索“SystemCapabilities”,依次找到“com.apple.Push”、“com.apple.InAppPurchase”、“com.apple.Siri”将其 enabled 键值从1修改为0,关闭退出使用 Xcode 重新打开该项目。

    6.Xcode配置反应有时候不那么及时,可刷新、重置相关配置项开关(若有)或重启Xcode试试。

十.

在 Xcode 7 中,苹果改变了自己在许可权限上的策略:

所谓“免证书”真机调试,并不是真的不需要证书,Xcode真机调试原有的证书配置体系仍在——All iOS, tvOS, and watchOS appsmust becode signed and provisioned to launch on a device. 所以,上文啰嗦几千字还是有点用的。
自 Xcode7 开始,原来基于付费开发者账号及自助生成证书及配置文件的繁琐过程被苹果简化,Xcode将针对任何普通账号自动为联调真机生成所需相关的证书及配置文件。当你打算向 App Store 提交发布应用,才需要付费。
第一步:进入 Xcode Preferences|Accounts,添加自己的 Apple ID 账号。
第二步:Build Settings|Code Signing 下的 Provisioning Profile 选择 Automatic,Code Signing Identity 选择 Automatic 下的iOS Developer

第三步:General 配置 Bundle identifier,Team 下拉选择苹果Member Center自动为你的账号生成的Personal Team ID。
自己的账号在调试公司或其他第三方APP代码时,若填写 Bundle identifier 为他人账号注册的 APP ID(例如苹果相机应用 com.apple.camera),会报错:

No provisioning profiles with a valid signing identity (i.e. certificate and private key pair) matching the bundle identifier “com.apple.camera” were found.  

如果启动APP时,Xcode报错“”或iPhone报错【】。

此时需要到iPhone通用配置中的描述文件(最新系统中可能叫设备管理)中,在描述文件(开发商应用)中选择对应的描述文件(你的Apple ID)点击 **信任 **或 **验证 **即可。

参考:

Copyright © 2019- yule263.com 版权所有 湘ICP备2023023988号-1

违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务