iOS 各种证书/签名详解

iOS应用重签名实战:使用iOS-App-Signer轻松打包与安装 本文详细介绍了使用iOS-App-Signer工具进行iOS应用重签名的完整流程,包括环境准备、证书获取、描述文件生成以及实际重签名操作。通过图形化界面简化了复杂的命令行操作,帮助开发者快速掌握重签名技术,适用于应用测试、定制版本分发等场景。 阅读详情
AI摘要

本文全面解析iOS开发过程中涉及的各种证书和配置文件,包括AppID、设备、开发证书、供应配置文件、App Group等内容,帮助读者深入理解iOS签名机制。

引言

        关于开发证书配置(Certificates & Identifiers & Provisioning Profiles),相信做 iOS 开发的同学没少被折腾。对于一个 iOS 开发小白、半吊子(比如像我自己)抑或老兵,或多或少会有或曾有过以下不详、疑问、疑惑甚至困惑:

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

本文将围绕相关概念及背景做个系统的梳理串烧,于条分缕析中对证书体系进行抽丝剥茧,逐步揭开签名机制的神秘面纱。图穷匕首见,水落而石出,包教不包会,不会请再来。

从 Xcode 7 开始支持普通 Apple 账号进行免证书真机调试,详情参考最新官方文档《Launching Your App on Devices》,或参考本文最后一节简介。

写在前面

1.假设你使用过 Apple 设备(iMac/iPad/iPhone)且注册过 Apple ID(Apple Account),详情参考《创建和开始使用 Apple ID》。

2.假设你或你所在的开发组已加入苹果开发者计划(Enroll in iOS Developer Program to become a member),即已注册开发者账号(Apple Developer Account)。

  • 只有拥有开发者账号,才可以申请开发/发布证书及相关配置授权文件,进而在 iOS 真机上开发调试 Apps 或发布到 App Store。
  • 开发者账号分为 Individual 和 Company/Organization 两种类型。如无特别交代,下文基于 $99/Year 的普通个人开发者(Individual)账号展开。

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

一.App ID(bundle identifier)

在苹果官方的开发者计划(Apple Developer Member Center)层面,App ID 即 Product ID,用于标识一个或者一组 App。

在 Mac/iOS 开发语境中,bundle(捆绑) 是指一个内部结构按照标准规则组织的特殊目录。在 Mac OS 应用程序目录下的某个 *.app 上可右键显示包内容(Contents),其本质上就是可执行二进制文件(MacOS/)及其资源(Resources/)的打包组合。因此,在 Xcode 中配置的 Bundle Identifier 必须和 App ID 是一致的(Explicit)或匹配的(Wildcard)。

App ID 字符串通常以反域名(reverse-domain-name)格式的 Company Identifier(Company ID)作为前缀(Prefix/Seed),一般不超过 255 个 ASCII 字符。

App ID 全名会被追加 Application Identifier Prefix(一般为 TeamID.),分为两类:

  • Explicit App ID:唯一的 App ID,用于唯一标识一个应用程序。例如“com.apple.garageband”这个 App ID,用于标识 Bundle Identifier 为“com.apple.garageband”的 App。
  • Wildcard App ID:含有通配符的 App ID,用于标识一组应用程序。例如“*”(实际上是 Application Identifier Prefix)表示所有应用程序;而“com.apple.*”可以表示 Bundle Identifier 以“com.apple.”开头(苹果公司)的所有应用程序。
用户可在 Developer Member Center 网站上注册(Register)或删除(Delete)已注册的 App IDs。
App ID 被配置到【XcodeTarget|Info|Bundle Identifier】下;对于 Wildcard App ID,只要 bundle identifier 包含其作为 Prefix/Seed 即可。

二.设备(Device)

Device 就是运行 iOS 系统用于开发调试 App 的设备。每台 Apple 设备使用 UDID (Unique Device Identifier)来唯一标识。

iOS 设备连接 Mac 后,可通过 iTunes->Summary 或者 Xcode->Window->Devices 查看其UDID。

Apple Member Center 网站个人账号下的 Devices 中包含了注册过的所有可用于开发和测试的设备,普通个人开发账号每年累计最多只能注册100个设备。

  • Apps signed by you or your team run only on designated development devices.
  • Apps run only on the test devices you specify.
用户可在网站上注册或启用/禁用(Enable/Disable)已注册的Device。
本文的 Devices 是指连接到 Xcode 被授权用于开发测试的iOS设备(iPhone/iPad)。

三.开发证书(Certificates)

1.证书的概念

证书是由公证处或认证机关开具的证明资格或权力的证件,它是表明(或帮助断定)事理的一个凭证。证件或凭证的尾部通常会烙印公章。

每个中国人一生可能需要70多个证件,含15种身份证明。证件中“必需的”有30到40个。将这些证件按时间顺序铺开,那就是一个天朝子民的一生——持准生证许可落地,以户籍证明入籍,以身份证认证身份,持结婚证以合法同居,最终以死亡证明注销。

2.数字证书的概念

数字证书就是互联网通讯中标志通讯各方身份信息的一串数字,提供了一种在 Internet 上验证通信实体身份的方式,其作用类似于司机的驾驶执照或日常生活中的身份证。它是由一个由权威机构——CA机构,又称为证书授权中心(Certificate Authority)发行的,人们可以在网上用它来识别对方的身份。
  • 数字证书是一个经证书授权中心数字签名的包含公开密钥拥有者信息以及公开密钥的文件。最简单的证书包含一个公开密钥、名称以及证书授权中心的数字签名。
  • 数字证书还有一个重要的特征就是时效性:只在特定的时间段内有效。

数字证书中的公开密钥(公钥)相当于公章。

某一认证领域内的根证书是 CA 认证中心给自己颁发的证书,是信任链的起始点。安装根证书意味着对这个 CA 认证中心的信任。

为了防止 GFW 进行中间人攻击(MitM),例如篡改 github 证书,导致无法访问 github 网站等问题,可选择不信任 CNNIC:

  • 在[钥匙串-系统]中双击 CNNIC ROOT,在【信任】|【使用此证书时】下拉选择【永不信任】。


在天朝子民的一生中,户籍证明可理解为等效的根证书:有了户籍证明,才能办理身份证;有了上流的身份证,才能办理下游居住证、结婚证、计划生育证、驾驶执照等认证。

3.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)。

4.iOS(开发)证书的根证书

那么,iOS 开发证书是谁颁发的呢?或者说我们是从哪个 CA 申请到用于 Xcode 开发调试 App 的证书呢?

iOS 以及 Mac OS X 系统(在安装 Xcode 时)将自动安装 AppleWWDRCA.cer 这个中间证书(Intermediate Certificates),它实际上就是 iOS(开发)证书的证书,即根证书(Apple Root Certificate)。

AppleWWDRCA(Apple Root CA)类似注册管理户籍的公安机关户政管理机构,AppleWWDRCA.cer 之于 iOS(开发)证书则好比户籍证之于身份证。

如果 Mac Keychain Access 证书助理在申请证书时尚未安装过该证书,请先下载安装(Signing requires that you have both the signing identity and the intermediate certificate installed in your keychain)。


5.申请证书(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 将生成一个包含开发者身份信息和公钥的CSR(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 开发网站上传包含公钥的 CSR 文件作为换取证书的凭证(Upload CSR file to generate your certificate),有点类似为github账号添加SSH公钥到服务器上进行授权。

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


从 Apple Member Center 网站下载证书到 Mac 上双击即可安装(当然也可在 Xcode 中添加开发账号自动同步证书和[生成]配置文件)。证书安装成功后,在 KeychainAccess|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 配置示例:


四.供应配置文件(Provisioning Profiles)

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)放在目录 ~/Library/MobileDevice/Provisioning Profiles 下。

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)。

每个应用程序都有一个可以用于安全保存一些如密码、认证等信息的 keychain,一般而言自己的程序只能访问自己的 keychain。通过对应用签名时的一些设置,还可以利用keychain的方式实现同一开发者签证(就是相同bundle seed)下的不同应用之间共享信息的操作。比如你有一个开发者帐户,并开发了两个不同的应用A和B,然后通过对A和B的 keychain access group 这个东西指定共用的访问分组,就可以实现共享此 keychain 中的内容。

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)。

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

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 的概念

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

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

App Group ID 同 App ID 一样,一般不超过255个ASCII字符。用户可在网站上编辑 Explicit App IDs,将其纳入 App Group(Assignment);也可删除(Delete)已注册的App Group (ID)。

2.App Group 的配置

Containing App 与 Extension 的 Explicit App ID 必须 Assign 到同一 App Group 下才能实现数据共享,并且 Containing App 与 Extension 的 App ID 命名必须符合规范:

  1. 置于同一App Group 下的 App IDs 必须是唯一的(Explicit,not Wildcard)
  2. Extension App ID 以 Containing App ID 为前缀(Prefix/Seed)

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

 

App(ex)

 

App Group ID

Provisioning Profile

Code Signing Identity

(Certificate Key Pair)

App ID

(bundle identifier)

Devices

(test)

GarageBand

置于同一分组:

group.com.apple

(1)共用同一证书:ios_development.cer

(2)共用证书Key Pair中的Private Key进行CodeSign

com.apple.garageband

授权开发测试设备的UDIDs

GarageBand扩展插件

com.apple.garageband.extImportRecording

关于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.Code Signing

每个证书(其实是公钥)对应 Key Pair 中的私钥会被用来对内容(executable code,resources such as images and nib files aren’t signed)进行数字签名(CodeSign)——使用哈希算法生成内容摘要(digest)。

Xcode 使用指定证书配套的私钥进行签名时需要授权,选择【始终允许】后,以后使用该私钥进行签名便不会再弹出授权确认窗口。


3.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 未被篡改过,即内容完整。
小结:
  • 基于 Provisioning Profile 校验了 CodeSign 的一致性;
  • 基于 Certificate 校验 App 的可靠性和完整性;
  • 启动时,真机的 device ID(UUID)必须在 Provisioning Profile 的 ProvisionedDevices 授权之列。
  • 无论是 Xcode 对 APP 进行签名打包还是真机运行 APP 进行校验,都使用了基于证书体系的非对称加密机制。

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

1.Xcode 导出开发者账号(*.developerprofile) 或 PKCS12 文件(*.p12)

进入 Xcode Preferences|Accounts:

  • 选中 Apple IDs 列表中对应 Account 的 Email,点击+-之后的☸|Export Accounts,可导出包含 account/code signing identity/provisioning profiles 信息的 *.developerprofile(Exporting a Developer Profile)文件供其他机器上的 Xcode 开发使用(Import 该 Account)。
选中右下列表中某行 Account Name 条目|ViewDetails,可以查看 Signing Identities 和 Provisioning Profiles。
  • 选中欲导出的 Signing Identity 条目,点击栏底+之后的☸|Export,必须输入密码,并需授权 export key "privateKey" from keychain,将导出 Certificates.p12。
点击左下角的刷新按钮可从 Member Center 同步该账号下所有的 Provisioning Profile 到本地。
选中右击列表中某个 Provisioning Profile 可以【Show in Finder】到[~/Library/MobileDevice/Provisioning\ Profiles]目录,其中 Provisioning Profile 的真实名称为 $(UUID).mobileprovision,名如"2488109f-ff65-442e-9774-fd50bd6bc827.mobileprovision",其中<key>Name</key>中为 Xcode 中看到的描述性别名。

2.Keychain Access 导出 PKCS12 文件(*.p12)

在 Keychain Access|Certificates 中选中欲导出的 certificate 或其下 private key,右键 Export 或者通过菜单 File|Export Items 导出 Certificates.p12——PKCS12 file holds the private key and certificate。

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

九.证书配置常见错误

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.No identities from profile

Build Settings|CodeSigning的Provisioning Profile中选择了本地安装的provisioning profile之后,Code Signing Identity中下拉提示No identities from profile “…”or No identities from keychain.

Xcode配置指定UDID的provisioning profile中的DeveloperCertificates在本地KeyChain中不存在(No identities are available)或不一致(KeyPair中的Private Key丢失),此时需去网站检查ProvisioningProfile中的App ID-Certificate-Device配置是否正确。如果是别人提供的共享账号(*.developerprofile)或共享证书(*.p12),请确保导出了对应Key Pair中的Private Key。必要时也直接在Xcode中Fix issue予以解决(可能自动生成iOS Team ProvisioningProfile)。

3.Code Signing Entitlements file do not match profile

"Invalid application-identifier Entitlement" or "Code Signing Entitlements file do not match those specified in your provisioning profile.(0xE8008016)."

(1)检查对应版本(Debug)指定的*.entitlements文件中的“Keychain Access Groups”键值是否与ProvisioningProfile中的Entitlements项相吻合(后者一般为前者的Prefix/Seed)。

(2)也可以将Build Settings|Code Signing的Provisioning Profile中对应版本(Debug)的Entitlements置空。

4.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。

5.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,在【Capabilities】中禁用“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试试。

十. Xcode7+ 免证书真机调试

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

  1. 此前 Xcode 只开放给注册开发者下载,现在 Xcode 7 改变了这种惯有的做法,无需注册开发者账号,仅使用普通的Apple ID就能下载和上手体验。
  2. 此前开发者需每年支付99美元的费用成为注册开发者才能在 iPhone/iPad 真机上运行调试APP,苹果新的开发者计划则放宽要求,无需购买,只要你感兴趣同样可以在设备上测试app。——Developers would be able to test apps on devices without a paid Apple developer account in 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),会报错:

[plain]  view plain  copy
 print ?
  1. 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自身与服务器校验也可能会报签名错误,肿么办???

Her skill:此时,可以在他人原有App ID基础上添加后缀(例如com.apple.camera.extension),配置成应用的衍生插件(相当于置于同一 App Group 下)就可以快乐的玩耍了。

解决了所有的开发配置问题,Xcode 8 Automatically manage signing 配置成功应该是这样子的:


如果启动APP时,Xcode报错“process launch failed: Security”或iPhone报错【不受信任的开发者】。


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


OK,All Done!

告别7天限制!保姆级教程:用AltStore+个人证书给任意IPA签名(Mac/Windows通用) 本文提供了一份详细的教程,教你如何使用AltStore和个人开发者证书为任意IPA文件签名,突破iOS应用的7天限制。通过注册Apple开发者账号、创建个人证书并配置AltStore,实现长期有效的应用签名,适用于Mac和Windows用户。 阅读详情

相关推荐

iOS应用备案必备:详解签名证书MD5与公钥的提取原理与实操

在iOS应用开发和上架流程中,代码签名是确保应用安全性与完整性的核心技术。其原理基于非对称加密体系,开发者使用私钥对应用进行签名,而公钥则用于系统验签,以此构建从开发到分发的可信链条。这项技术不仅保障了应用在安装和运行时的安全性,防止篡改和恶意代码注入,更是实现App Store合规分发、企业内部分发等场景的基石。随着移动应用合规要求日益严格,特别是在应用备案等环节,准确提供签名证书的核心信息——如MD5指纹和公钥——成为连接开发主体与应用身份的关键步骤。本文将聚焦于iOS签名体系中的证书文件,深入解析如何

weixin_30696427的博客 338

IOS_添加新设备到 iOSTeam Provisioning Profile

1.首先去苹果开发者官网,添加手机UDID 添加完后 来到Xcode 2.Target --> General --> Signing -->Provisioning Profile Xcode Managed Profile 3.点击 "Provisioning Profile Xcode Managed Profile"旁边的 "?" 号 4.然后将...

weixin_42137574的博客 3986

iOS自动化测试WebDriverAgent证书签名原理与实战避坑指南

在iOS自动化测试领域,代码签名是保障应用安全与来源可信的核心机制。其原理基于苹果的开发者生态,通过证书、描述文件和设备UDID的三重验证,确保应用只能在授权设备上安装运行。这项技术对于实现真机自动化测试至关重要,能有效防止未授权应用执行,保障测试环境的安全与稳定。在Appium结合WebDriverAgent(WDA)进行iOS自动化测试的实践中,证书配置是打通真机测试链路的关键步骤,直接关系到自动化脚本能否成功驱动设备。本文聚焦于WebDriverAgent这一特殊xctest测试包的签名难题,深入解析

weixin_28835551的博客 250

Provisioning Profiles

[iOS] 關於 Provisioning Profiles 這些事 http://lamb-mei.com/7/ios-provisioning-profiles/ [前言] 當擁有有開發者帳號最重要的一件事情就是實機部屬測試,但事與願違,進行實機測試常常會有很多錯誤,讓你憑證檔 (Certificates) 跟提供描述檔(Provisioning Prof...

weixin_34138377的博客 569

Godot导出iOS全流程:签名证书与Xcode自动管理详解

iOS 应用分发依赖一套严格的签名机制,证书与描述文件共同确保应用来源可信、内容完整并限定运行设备。对于跨平台引擎开发的游戏,导出与上架环节经常卡在签名配置上。理解 CSR、公钥私钥、Bundle Identifier 与 App ID 的一致性,是顺利构建的基础。实际工程中,Godot 导出 iOS 工程后,在 Xcode 中启用自动签名并选择正确的 Team,可以有效避免手动指定证书与描述文件的诸多陷阱。本文梳理从创建证书、配置描述文件到归档上传 App Store Connect 的完整链路,并针对常

weixin_28718755的博客 253

iOS超级签名系统源码:自建APP分发闭环教程

iOS应用分发是开发者绕不开的基础能力,其核心在于利用Apple官方Ad Hoc签名机制实现非App Store渠道的合规安装。原理上依赖UDID注册、Provisioning Profile动态生成与IPA重签名三步闭环,技术价值在于规避TestFlight人数限制与企业证书高吊销风险,提升内测响应速度与灰度可控性。典型应用场景包括外包项目交付、客户现场演示、独立开发者快速迭代等。本文详解全开源超级签名系统源码的部署逻辑、Mac签名机配置要点及IPA重签名关键命令,覆盖从Web分发页到iOS设备安装的完整

weixin_29698641的博客 307

iOS Provisioning Profile(Certificate)与Code Signing详解

引言         关于开发证书配置(Certificates & Identifiers & Provisioning Profiles),相信做iOS开发的同学没少被折腾。对于一个iOS开发小白、半吊子(比如像我自己)抑或老兵,或多或少会有或曾有过以下不详、疑问、疑惑甚至困惑: 什么是App ID?Explicit/Wildcard App ID有何区别?什么是App Group

IT一分子 1930

# 多用户 JupyterHub 配置教程(通用 Linux 服务器版)

以上即是通用 Linux 服务器上的多用户 JupyterHub 实战配置。从安装认证与 Spawner 选择自动创建系统用户到反代与运维,覆盖了小团队到中等规模的主流场景。根据团队增长与合规要求,你可以进一步引入、统一身份源(LDAP/OAuth2/Keycloak)与资源配额治理,平滑演进到企业级部署。

数字化老司机 1288

iOS开发笔记 8、真机调试和发布软件

首先根据需要缴纳$99/299的费用加入成员计划。 按照如下的不同角色和操作界面即可完成代码的调试和发布   概括起来: 申请人Team Agent角色加开发管理员和申请软件的发布 Team Admin开发管理员可以自己调试和加人   过程涉及:证书,apple ID,机器ID等系列的步骤,比较麻烦,简便的方法 1、将iphone/ipad连接到USB接口 2、在Xcode的Wi...

weixin_34161032的博客 154

GPS数据处理必备:IGS精密星历下载与使用全攻略(附武汉大学/CDDIS/CODE/GFZ地址)

本文为GPS/GNSS数据处理者提供了IGS精密星历的完整下载与使用指南。详细解析了最终、快速、超快速三种精密星历产品的区别与选择策略,并手把手教学如何从武汉大学、CDDIS、CODE、GFZ四大主流数据中心高效获取数据,涵盖文件命名规则解析及自动化下载脚本,助力科研与工程应用。

weixin_29234239的博客 677

用Python+OpenCV给斗地主做个‘外挂’:手把手教你写个桌面记牌器(附源码)

本文详细介绍了如何使用Python和OpenCV开发一个智能斗地主记牌器,包括环境搭建、图像采集与预处理、扑克牌识别技术及PyQt5界面设计。通过实战案例,帮助开发者掌握图像处理与界面开发的结合应用,提升游戏辅助工具的编写能力。

weixin_29079643的博客 543

苹果非企业账号通过添加UDID打IPA包

非企业账号能通过添加设备的UDID到开发者账号,从而打出IPA分发吧 1、先获取IOS的设备UDID,并添加到Devices里面 2、生成 Provisioning Profile 文件: 添加一个新的Profiles, 在Distribution选项里面选择Ad Hoc 类型, 然后在Generate a Provisioning Profile 页面选择...

shengtianzhu的专栏 2283

使用ExcelJS向XLSX单元格居中插入图片

本文记录了使用ExcelJS库向XLSX单元格里居中写入图片的方法。本文内容包括:xlsx 文件格式;xlsx 图片定位的长度单位;使用nativeColOff和nativeRowOff进行定位,不要使用官网给的定位方式;添加图片到数据表的总体流程和样例代码;注意事项等。

weixin_43678000的博客 3456

终极FoldingCell代码签名指南:企业与开发证书配置全攻略

FoldingCell是一款由Ramotion开发的可扩展内容单元格组件,以其流畅的动画效果在iOS开发中广受欢迎。本文将详细介绍如何为FoldingCell项目配置企业证书与开发证书,帮助开发者快速解决代码签名难题,确保应用顺利部署。 ## FoldingCell简介:为什么选择这款动画组件? FoldingCell提供了独特的单元格展开收起动画效果,为iOS应用带来流畅的交互体验。以下是F

gitblog_00606的博客 820

WGS-84 ECEF ENU 坐标系学习记录

地球坐标系固定在地球上而随地球一起在空间做公转和自转运动,因此地球上任一固定点在地球坐标系的坐标就不会由于地球旋转而变化。地心地固直角坐标系和大地坐标系都属于这种坐标系。 一、 几种坐标系 地心地固直角坐标系(ECEF)坐标系 其原点为地球的质心,x轴延伸通过本初子午线(0度经度)和赤道(0deglatitude)的交点。 z轴延伸通过的北极(即,与地球旋转轴重合)。 y轴完成右手坐标系,穿...

YYshuangshuang的博客 1万+

innovus:给channel加soft blockage

dbGet [dbGet top.fplan.pBlkgs.name finishfp_place_blkg_* -p].boxes就可以获得channel坐标。意思是给30um以下的channel加soft blk,至于channel的坐标,通过抓取该soft blk去获取,比较容易。工具自己加入的placement blockage命名上叫finishfp_place_blkg_*ICC2中有给channel自动加soft blockage的命令,相应的innovus也有类似的命令,我们可以使用。

m0_61544122的博客 480

Feather证书验证流程:iOS应用安全签名的终极指南

想要在iOS设备上安全安装应用吗?Feather作为一款免费的设备端应用管理器,通过苹果开发者证书实现安全签名,让您轻松管理应用安装。本文将为您详细解析Feather证书验证的全流程,从导入到签名的每一步安全检查。🔐 ## 什么是Feather证书验证? Feather证书验证是iOS应用安装的核心安全机制,它确保只有经过苹果开发者认证的应用才能在您的设备上运行。这一过程涉及到证书的导入、解

gitblog_00975的博客 400

YOLOv8 | 损失函数改进,最新提出的Shape-IoU,有效涨点

作为检测器定位分支的重要组成,边框回归损失在目标检测任务中发挥巨大作用。现有的边框回归方法,通常考虑了GT框与预测框之间的几何关系,通过使用边框间的相对位置与相对形状等计算损失,而忽略了边框其自身的形状与尺度等固有属性对边框回归的影响。为了弥补现有研究的不足,本文提出聚焦边框自身形状与尺度的边框回归方法。首先我们对边框回归特性进行分析,得出边框自身形状因素与尺度因素会对回归结果产生影响。

kay_545 1913

Windows OpenSSL 生成 iOS 证书,制作 p12 与描述文件,KXBuild 签名实操

iOS 签名要 .p12 证书和 .mobileprovision 描述文件,官方流程得在 Mac 的钥匙串里生成 CSR。这篇在 Windows 上用 OpenSSL 做完同样的事:生成私钥和 CSR、上传 Apple 后台下载 .cer、合成 .p12,再注册 App ID、用 kxdevice 取 UDID 加测试设备、生成描述文件,最后放进 KXBuild 的证书目录签名装机。还讲了开发证书与发布证书的区别、OpenSSL 3 的 -legacy 兼容和私钥备份续期。

2501_91600747的博客 186

【txt文本加密】使用 cryptography 库实现加密和解密

cryptography 库是一个强大的 Python 库,用于实现加密和解密功能。它提供了各种加密算法,包括对称加密、非对称加密、哈希函数等。

📷 图像处理践行者 | 传统算法 · 深度学习 · 多模态 | 分享实战经验与技术洞见,探索从像素到智能的无限可能。 2666

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

UniApp跨平台应用备案指南:iOS与Android证书获取全流程解析

本文详细解析了UniApp跨平台应用备案中iOS与Android证书获取的全流程,重点介绍了iOS平台p12证书的申请步骤和Android平台签名信息的获取方法。通过实操技巧和常见问题解决方案,帮助开发者高效完成应用备案,确保应用顺利上架。

qsc9012345的博客 438

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

iOS 打包签名资料准备指南(HBuilderX / uni-app)

提示:描述文件名称仅用于识别,不影响功能实现。

FantasyWeirdo的博客 497

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

ios:证书配置

钥匙串生成CSR → 后台建Apple Distribution证书 → 注册带权限AppID → 生成App Store描述文件 → Xcode勾选自动签名绑定Team → 主App+Widget双Target统一配置完毕。

分享前端开发工程师的一些日常生活、前端知识点、职业发展、对一些问题的看法、感悟等等 449

移动端安全开发:Android 签名与 iOS 证书,防止 APP 被篡改的方法

Android 和 iOS 的签名机制本质相似,都基于公钥基础设施(PKI),核心公式可表示为: $$ \text{签名} = \text{Sign}(\text{私钥}, H(\text{应用})) $$ 其中 $H$ 是哈希函数(如 SHA-256),验证时使用: $$ \text{Verify}(\text{公钥}, \text{签名}, H(\text{应用})) = \text{真/假} $$ 如果输出为假,表明应用被篡改。如果应用被篡改,签名验证会失败,系统拒绝安装或运行。

2501_93892580的博客 481

终极iOS应用重签名指南:使用isign快速解决设备限制

isign是一款强大的开源工具,能够帮助开发者在不依赖Apple专有软件或硬件的情况下对iOS应用进行重签名。本文将为你提供一份完整的isign使用指南,让你轻松解决iOS设备的安装限制问题。 ## 为什么选择isign? 对于iOS开发者来说,应用签名是一个必不可少的环节。传统的签名方式需要依赖Xcode和Apple开发者账号,这给很多独立开发者和测试人员带来了不便。isign的出现,彻底改

gitblog_00472的博客 450

iOS App Signer完全指南:如何用3个步骤完成iOS应用重签名

iOS App Signer是一款强大的macOS应用重签名工具,能够帮助你重新签名iOS应用并打包成ipa文件,支持ipa、deb、app和xcarchive多种输入格式。无论你是开发者需要测试企业应用,还是需要对现有应用进行修改和重新分发,这款工具都能为你提供便捷的签名解决方案。 ## 为什么你需要iOS应用重签名?🤔 iOS应用重签名是iOS开发和企业应用分发中的关键环节。当你遇到以下

gitblog_00801的博客 170
上一篇: HY项目中问题总结(tableview 的细节处理以及基类的使用)
下一篇: IOS 开发 iPhone屏幕尺寸、分辨率及适配
小桃酥
博客等级 码龄10年 23粉丝 57原创
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值