ios开发证书详解(下)

简介: ios开发证书详解(下)

编辑切换为居中


添加图片注释,不超过 140 字(可选)


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


923cd2dca9a1c8eaab9dd7afe3b01ca4.png



编辑切换为居中


添加图片注释,不超过 140 字(可选)


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


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



31f16b24f98ee97e3febd4eaec836bac.png


编辑切换为居中


添加图片注释,不超过 140 字(可选)


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

de54003a420299432b75fc2a5852067b.png




编辑切换为居中


添加图片注释,不超过 140 字(可选)


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。


8dd77d2d3c5fe07e46d2fb99d216727c.png



编辑切换为居中


添加图片注释,不超过 140 字(可选)


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】下。


六.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)已注册的AppGroup (ID)。 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”。 App(ex) App Group IDProvisioning ProfileCode Signing Identity (Certificate Key Pair)App ID (bundle identifier)Devices (test)GarageBand置于同一分组: group.com.apple(1)共用同一证书:ios_development.cer (2)共用证书Key Pair中的Private Key进行CodeSigncom.apple.garageband授权开发测试设备的UDIDsGarageBand扩展插件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


561813d319e7ab02ef09335b9babf10d.png



编辑切换为居中


添加图片注释,不超过 140 字(可选)



31a852e24bd1b17b552d9582e7386aab.png


编辑切换为居中


添加图片注释,不超过 140 字(可选)


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


a16f51f02012649d50ba7834142eac27.png



编辑切换为居中


添加图片注释,不超过 140 字(可选)


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


d6c11bd88212086772ce8cc26fb876bc.png



编辑切换为居中


添加图片注释,不超过 140 字(可选)


第二步,iOS/Mac真机上的ios_development.cer被AppleWWDRCA.cer中的 public key解密校验合法后,获取每个开发证书中可信任的公钥对App的可靠性和完整性进行校验。 iOS/Mac设备(系统)使用App Provisioning Profile(Code Signing Identity)中的开发证书来判断App的合法性:


若用证书公钥能成功解密出App(executable code)的内容摘要(Signature),证明此App确乃认证开发者发布,即来源可信;


再对App(executable code)本身使用哈希算法计算摘要,若与上一步得到的摘要一致,则证明此App(executable code)未被篡改过,即内容完整。


小结:


基于Provisioning Profile校验了CodeSign的一致性;


基于Certificate校验App的可靠性和完整性;


启动时,真机的device ID(UUID)必须在Provisioning Profile的ProvisionedDevices授权之列。


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


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.Xcode配置反应有时候不那么及时,可刷新、重置相关配置项开关(若有)或重启Xcode试试。


十. Xcode7 免证书真机调试


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


此前 Xcode 只开放给注册开发者下载,现在 Xcode 7 改变了这种惯有的做法,无需注册开发者账号,仅使用普通的Apple ID就能下载和上手体验。


此前开发者需每年支付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 be code 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自身与服务器校验也可能会报签名错误,肿么办??? Her skill:此时,可以在他人原有App ID基础上添加后缀(例如com.apple.camera.extension),配置成应用的衍生插件(相当于置于同一 App Group 下)就可以快乐的玩耍了。 如果启动APP时,Xcode报错“process launch failed: Security”或iPhone报错【不受信任的开发者】,此时需要到iPhone通用配置中的描述文件(最新系统中可能叫设备管理)中,在描述文件(开发商应用)中选择对应的描述文件(你的Apple ID)点击 信任 或 验证 即可。

相关文章
|
4天前
|
JavaScript 搜索推荐 Android开发
【01】仿站技术之python技术,看完学会再也不用去购买收费工具了-用python扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-客户的麻将软件需要下载落地页并且要做搜索引擎推广-本文用python语言快速开发爬取落地页下载-优雅草卓伊凡
【01】仿站技术之python技术,看完学会再也不用去购买收费工具了-用python扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-客户的麻将软件需要下载落地页并且要做搜索引擎推广-本文用python语言快速开发爬取落地页下载-优雅草卓伊凡
23 8
【01】仿站技术之python技术,看完学会再也不用去购买收费工具了-用python扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-客户的麻将软件需要下载落地页并且要做搜索引擎推广-本文用python语言快速开发爬取落地页下载-优雅草卓伊凡
|
1月前
|
iOS开发 开发者
uniapp开发ios打包Error code = -5000 Error message: Error: certificate file(p12) import failed!报错问题如何解决
uniapp开发ios打包Error code = -5000 Error message: Error: certificate file(p12) import failed!报错问题如何解决
143 67
uniapp开发ios打包Error code = -5000 Error message: Error: certificate file(p12) import failed!报错问题如何解决
|
2月前
|
存储 监控 API
app开发之安卓Android+苹果ios打包所有权限对应解释列表【长期更新】-以及默认打包自动添加权限列表和简化后的基本打包权限列表以uniapp为例-优雅草央千澈
app开发之安卓Android+苹果ios打包所有权限对应解释列表【长期更新】-以及默认打包自动添加权限列表和简化后的基本打包权限列表以uniapp为例-优雅草央千澈
90 11
|
2月前
|
iOS开发 开发者 MacOS
深入探索iOS开发中的SwiftUI框架
【10月更文挑战第21天】 本文将带领读者深入了解Apple最新推出的SwiftUI框架,这一革命性的用户界面构建工具为iOS开发者提供了一种声明式、高效且直观的方式来创建复杂的用户界面。通过分析SwiftUI的核心概念、主要特性以及在实际项目中的应用示例,我们将展示如何利用SwiftUI简化UI代码,提高开发效率,并保持应用程序的高性能和响应性。无论你是iOS开发的新手还是有经验的开发者,本文都将为你提供宝贵的见解和实用的指导。
143 66
|
2月前
|
开发框架 Android开发 iOS开发
安卓与iOS开发中的跨平台策略:一次编码,多平台部署
在移动应用开发的广阔天地中,安卓和iOS两大阵营各占一方。随着技术的发展,跨平台开发框架应运而生,它们承诺着“一次编码,到处运行”的便捷。本文将深入探讨跨平台开发的现状、挑战以及未来趋势,同时通过代码示例揭示跨平台工具的实际运用。
173 3
|
2月前
|
Java 调度 Android开发
安卓与iOS开发中的线程管理差异解析
在移动应用开发的广阔天地中,安卓和iOS两大平台各自拥有独特的魅力。如同东西方文化的差异,它们在处理多线程任务时也展现出不同的哲学。本文将带你穿梭于这两个平台之间,比较它们在线程管理上的核心理念、实现方式及性能考量,助你成为跨平台的编程高手。
|
3月前
|
存储 前端开发 Swift
探索iOS开发:从新手到专家的旅程
本文将带您领略iOS开发的奇妙之旅,从基础概念的理解到高级技巧的掌握,逐步深入iOS的世界。文章不仅分享技术知识,还鼓励读者在编程之路上保持好奇心和创新精神,实现个人成长与技术突破。
|
3月前
|
安全 IDE Swift
探索iOS开发之旅:从初学者到专家
在这篇文章中,我们将一起踏上iOS开发的旅程,从基础概念的理解到深入掌握核心技术。无论你是编程新手还是希望提升技能的开发者,这里都有你需要的指南和启示。我们将通过实际案例和代码示例,展示如何构建一个功能齐全的iOS应用。准备好了吗?让我们一起开始吧!
|
3月前
|
开发框架 前端开发 Android开发
安卓与iOS开发中的跨平台策略
在移动应用开发的战场上,安卓和iOS两大阵营各据一方。随着技术的演进,跨平台开发框架成为开发者的新宠,旨在实现一次编码、多平台部署的梦想。本文将探讨跨平台开发的优势与挑战,并分享实用的开发技巧,帮助开发者在安卓和iOS的世界中游刃有余。
|
3月前
|
安全 Swift iOS开发
Swift 与 UIKit 在 iOS 应用界面开发中的关键技术和实践方法
本文深入探讨了 Swift 与 UIKit 在 iOS 应用界面开发中的关键技术和实践方法。Swift 以其简洁、高效和类型安全的特点,结合 UIKit 丰富的组件和功能,为开发者提供了强大的工具。文章从 Swift 的语法优势、类型安全、编程模型以及与 UIKit 的集成,到 UIKit 的主要组件和功能,再到构建界面的实践技巧和实际案例分析,全面介绍了如何利用这些技术创建高质量的用户界面。
72 2

热门文章

最新文章

  • 1
    Cellebrite UFED 4PC 7.71 (Windows) - Android 和 iOS 移动设备取证软件
    24
  • 2
    【03】仿站技术之python技术,看完学会再也不用去购买收费工具了-修改整体页面做好安卓下载发给客户-并且开始提交网站公安备案-作为APP下载落地页文娱产品一定要备案-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
    33
  • 3
    【02】仿站技术之python技术,看完学会再也不用去购买收费工具了-本次找了小影-感觉页面很好看-本次是爬取vue需要用到Puppeteer库用node.js扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
    28
  • 4
    【01】仿站技术之python技术,看完学会再也不用去购买收费工具了-用python扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-客户的麻将软件需要下载落地页并且要做搜索引擎推广-本文用python语言快速开发爬取落地页下载-优雅草卓伊凡
    23
  • 5
    uniapp开发ios打包Error code = -5000 Error message: Error: certificate file(p12) import failed!报错问题如何解决
    143
  • 6
    【05】2025年1月首发完整版-篇幅较长-苹果app如何上架到app store完整流程·不借助第三方上架工具的情况下无需花钱但需仔细学习-优雅草央千澈详解关于APP签名以及分发-们最关心的一篇来了-IOS上架app
    234
  • 7
    app开发之安卓Android+苹果ios打包所有权限对应解释列表【长期更新】-以及默认打包自动添加权限列表和简化后的基本打包权限列表以uniapp为例-优雅草央千澈
    90
  • 8
    深入探索iOS开发中的SwiftUI框架
    143
  • 9
    ios样式开关按钮jQuery插件
    58
  • 10
    Android与iOS生态差异深度剖析:技术架构、开发体验与市场影响####
    75