Xcode 中的“代码签名身份”是什么?
他们是证书吗?
他们是私钥吗?
他们是应用程序ID吗?
它们是配置文件吗?
如果我进入目标构建设置,它会要求提供代码签名身份,所以我需要弄清楚这一点。
我以为我们使用我们的私钥签署了代码。但是,我的私钥名称都没有出现。它显示了证书列表(我认为,虽然我什至不确定。)
您肯定遇到了一个很快就变得非常深入的话题,并且在尝试构建 iOS 应用程序的设备构建时是一个常见的头痛来源。首先,让我围绕代码签名过程中涉及的每个术语(包括您和以后遇到此问题的任何人)提出一个小结构,然后我们可以转向您的主要问题:
代码签名术语
iOS 设备构建的代码签名阶段是我们对应用程序中的特定数据排列进行加密签名和保护的过程,包括应用程序可执行二进制文件本身、任何嵌入式媒体资产(如按钮纹理、自定义图稿、字体等)。 ),以及一组关于我们的应用程序的元数据,代表我们应用程序数据的唯一“指纹”。 Apple 和 iOS 使用此指纹来帮助确保我们的应用程序在交付给用户设备或在用户的 iOS 设备上运行时不会被篡改。为实现这一点,开发人员需要在 Apple 注册、设置应用标识符、申请开发和分发证书、注册一组测试设备,最后为他们的开发工作申请配置文件。这些元素中的每一个的作用如下:
App Identifier(或 AppID)- 一个反向 DNS 样式的字符串,它唯一地标识 AppStore 上的一个 iOS 应用程序。
开发和分发证书 - 这些是由 Apple 以加密方式签名的数字文件,用于证明文件所发给的个人的身份。对于那些熟悉公钥基础设施的人来说,证书本身包含一个公钥,可用于稍后在此过程中验证签名的完整性。
测试设备 - iOS 软件唯一经批准的标准分发渠道是通过 AppStore。通过注册测试设备,开发人员可以绕过 AppStore 并将软件直接安装到设备上以进行开发和测试。给定会员年度允许的测试设备总数为 100 个测试设备。
Provisioning Profile - 包含三个主要组件的文档:1) 一个 App ID,2) 一个或多个 iOS 开发人员证书,以及 3) 零个或多个注册测试设备,可以直接安装指定的 iOS 应用程序。本文档的内容由 Apple 加密签名,以确保其内容不会被篡改。
正是此文件的存在和指纹检查确定开发人员生成的应用程序是否可以安装到设备上,因为它包含“谁”(证书)、“什么”(AppID)和“位置”的概念'(哪些设备)。
太好了,我明白了……现在这个 Code Sign Identity 怎么样?
在单个构建目标的构建设置的上下文中,术语代码签名身份是指安装在开发人员机器的钥匙串中的那些证书的通用名称。在 Xcode 构建设置中,它显示为一个选项列表,开发人员必须从中选择要用于 CodeSign 的身份 - 此菜单的每个部分中都编码了很多信息:
https://i.stack.imgur.com/3zxIH.png
首先看黑色文本——来自上图中的“iPhone 开发者:Bryan Musial (XXXXXXXXXX)”——这确实是 Xcode 用来查找用于 Code Sign 的公钥和私钥的主要项目。选择此项目时,您将指示 Xcode 进入您的钥匙串并尝试查找其“通用名称”字段与该字符串匹配的证书,然后获取该证书(其中包含公钥)和关联的私钥以用于代码签名操作。
如果您打开 Keychain Access 并双击任何“iPhone 开发:...”或“iPhone 分发:...”证书,那么为了彻底一点,证书会显示 Apple 向其开发人员颁发的证书中编码的所有信息。如果我要选择第一张图片中的条目,Xcode 将进入我的钥匙串并拉回此证书(注意:唯一标识详细信息已被 X'd 或更改):
https://i.stack.imgur.com/MOQS6.png
如您所见,来自 Xcode 选择的黑色文本与我的证书中的 Common Name 字段完全匹配,因此 Xcode 将撤回此证书及其链接的私钥,以用于对我的应用程序进行代码签名。
再次回顾 Xcode 设置,我们还注意到该菜单选项中还有更多文本——较浅的灰色文本标识将内置到应用程序中的 Provisioning Profile。在我的示例设置中,Xcode 将获取配置文件“MyiOSApp Testing”,其 AppID 设置为“com.myiosapp.*”。 Xcode 非常热衷于存储 Provisioning Profiles,幸运的是,Organizer 为您提供了一个查看已安装的 Provisioning Profiles 并了解它们包含的基本数据的好地方。同样对于第一张图片中的 Xcode Code Sign Identity,我的 Organizer 中的相关 Provisioning Profile 将如下所示:
https://i.stack.imgur.com/nLCe6.png
“名称”列和 App Identifier 列的尾端与我的 Xcode 设置中的浅灰色文本匹配,因此这是在代码签名期间选择使用的配置文件。注意行尾的“状态”列也很重要。在这种情况下,它为绿色并指示“有效配置文件”。这意味着我的钥匙串至少有一个在该配置文件中编码的证书的公钥和私钥。如果此状态不是绿色,则说明您当前的公钥/私钥设置和/或配置文件存在问题——除非您尝试使用的配置文件的状态设置为绿色,否则代码签名无法工作.其他可能的状态选项包括:
https://i.stack.imgur.com/jHUgC.png
未找到有效的签名身份:您没有至少一个在此供应配置文件中编码的证书的公钥和私钥。从 Organizer 中删除配置文件,然后返回 developer.apple.com/ios 上的证书、标识符和配置文件工具,并确保您的开发证书包含在配置配置文件中。验证您在 Keychain Access 中的证书没有过期或被吊销,并且有一个链接到公钥证书的私钥。
配置文件已过期:配置文件的过期日期已过。从 Organizer 中删除此配置文件,然后重新访问 developer.apple.com/ios 上的证书、标识符和配置文件工具并重新发布此配置文件(如果仍然需要它)
其他可能会绊倒你的物品
除了确保您安装了公钥和私钥以及配置文件设置正确的所有细微差别之外,还有一些其他事情可能会让开发人员感到困惑。首先,Xcode 收集 Provisioning Profiles 并保留它们,直到您告诉它删除它们。从理论上讲,这并不是什么大不了的事情,除非您更改配置文件、下载并安装更新版本。很多时候 Xcode 会获取正确的配置文件,但有时它不会正确处理,您将花费数小时查看证书、标识符和配置文件工具以及您的钥匙串,以尝试了解正在发生的事情。
建议 1:在安装更新版本的 Provisioning Profile 时,删除旧版本,这样 Xcode 就不会处于可能需要做出决定的位置。
如果您重新颁发开发或分发证书,可能会发生类似的事情——大多数情况下,Xcode 会在构建期间触发关于不明确证书的警告。
建议2:在构建过程中注意歧义警告。这意味着您有一个满足构建标准的旧证书浮动,并且可能会被无意使用,从而可能导致构建问题。
建议 3:每当您在钥匙串中处理您的证书时,请查找带有红色“X”的“iPhone 开发人员:...”或“iPhone 分发:...”证书。这是证书已过期或已被吊销的指示符。无论哪种方式,此公钥(以及可能链接的私钥)都不再用于构建目的,并且可以删除。
最后,代码签名身份设置还有一个选项,列为“自动配置文件选择器”。在许多情况下,您将希望使用此选项,因为它会尽力从构建目标的设置中自动查找您的 AppID,查找与该 AppId 匹配并包含您拥有公钥和私钥的证书的配置文件.在某些自定义构建情况下,可能无法使用此选项,您必须使用其中一个固定的特定选项,例如我在第一张图片中的演示设置。如果您使用固定选项,请注意 - 任何时候更新配置文件时,您还需要更新代码签名身份构建设置以匹配较新的版本。
关键要点
确保您的 Keychain 和 Xcode Provisioning Profile 列表保持干净和重复数据删除。
安装证书和配置文件后,确保组织者将该配置文件的状态报告为绿色(“有效配置文件”)。任何其他状态都表明您的钥匙串和配置文件之间存在问题,在您考虑运行构建之前需要解决该问题。
尝试使用“自动配置文件选择器”。如果您的队友和任何自动构建系统也不必考虑代码签名身份设置,他们就会对您更满意。
如果您不能使用自动配置文件选择器,请确保您始终保持该设置是最新的,因为您的供应配置文件进行了更新的迭代。
祝您的构建配置好运,如果您有任何其他后续问题,请告诉我!
您只能使用证书签署您的应用程序。
该证书是:
开发证书(从 Xcode 构建到您的物理设备中)
企业证书(为员工打造)
应用商店证书(为现实世界的客户构建)
以下将列出您在 Mac 上可用于签名的证书。
security find-identity -p codesigning -v
矿山回报示例:
1) A0D1B4FBH9768DA909766DC27D6882088A994473 "Apple Development: Mohammad F (5ABCS7TRT6)"
2) 5404044732CF2A011D95C28222DCF0000D3B84E "Apple Development: mfaani@foo.com (97ENL333NA)"
我的两个证书可以通过以下任一方式识别:
A0D1B4FBH9768DA909766DC27D6882088A994473 或“苹果开发:穆罕默德 F (5ABCS7TRT6”
5404044732CF2A011D95C28222DCF0000D3B84E 或“苹果开发:mfaani@foo.com (97ENL333NA)”
概括
代码签名身份是可以唯一标识您的证书的任何内容。