Xcode中的代码签名身份是什么?

70

在 Xcode 中,“代码签名标识”是什么?

它们是证书吗?

它们是私钥吗?

它们是应用程序 ID 吗?

它们是预配配置文件吗?

如果我进入目标构建设置,它会要求输入代码签名标识,因此我需要弄清楚这个问题。

我以为我们使用自己的私钥来签名代码。然而,我的私钥名称没有显示出来,它显示了一张证书列表(我觉得是,但我也不确定)。

2个回答

161
您绝对碰到了一个深入并且很快变得非常复杂的话题,它是制作iOS应用程序设备版本时常见的头痛之源。首先,让我为参与代码签名过程的术语(包括您和其他人)提供一些结构,然后我们可以转向您的主要问题: CodeSign 术语 iOS设备版本的代码签名阶段是指对应用程序中特定数据(包括应用程序可执行二进制文件本身、任何嵌入式媒体资产(如按钮纹理、自定义艺术品、字体等)以及关于我们应用程序的一组元数据)进行加密签名和保护的过程,并代表应用程序数据的唯一“指纹”。这个指纹是苹果和iOS用来确保在将我们的应用程序交付给用户设备或在用户的iOS设备上运行时,不被篡改的。为了实现这一点,开发者需要向苹果注册、设置应用标识符,请求开发和发布证书,注册一组测试设备,最后为他们的开发工作请求配置文件。每个元素的作用如下:
- 应用标识符(或AppID):反向DNS风格的字符串,唯一标识App Store上的一个iOS应用程序。 - 开发和发布证书:这些是由苹果加密签名的数字文档,用于证明发放这些文档的个人的身份。对于熟悉公钥基础设施的人来说,证书本身包含一个公钥,可以用来验证后续过程中签名的完整性。 - 测试设备:iOS软件唯一批准的标准分发渠道是通过App Store。通过注册测试设备,开发者可以绕过App Store,在设备上直接安装软件进行开发和测试。在一个成员年度内允许的测试设备总数为100个。 - 配置文件:包含三个主要组件的文档:1)恰好一个应用程序ID,2)一个或多个iOS开发者证书,以及3)允许在命名的iOS应用程序可直接安装的零个或多个注册测试设备。这个文档的内容经过苹果的加密签名,以确保其内容不会被篡改。
正是由于这个文件的存在和指纹检查,确定了开发者生成的应用程序是否能够安装到设备上,因为它包含“谁”(证书)、“什么”(AppID)和“在哪里”(哪些设备)的概念。
现在我们已经了解了这些,那么Code Sign Identity是什么呢?
在单个构建目标的构建设置上下文中,术语Code Sign Identity指的是安装在开发者计算机的钥匙串中的证书的通用名称。在Xcode构建设置中,它显示为一个选项列表,开发者必须从中选择一个身份来用于CodeSign -- 每个部分都编码了很多信息。

Xcode Code Sign Identity

首先看黑色文本 - 从上面的图片看到 'iPhone Developer: Bryan Musial (XXXXXXXXXX)' - 这实际上是 Xcode 用来查找用于代码签名的公钥和私钥的主要项目。选择此项目时,您指示 Xcode 访问您的 Keychain 并尝试查找其“通用名称”字段与该字符串匹配的证书,然后提取该证书(其中包含公钥)和相关联的私钥以用于代码签名操作。

为了全面,如果您打开 Keychain Access 并双击任何 'iPhone Development:...' 或 'iPhone Distribution:...' 证书,将显示 Apple 发布给其开发人员的证书中编码的所有信息。如果我选择第一张图像中的条目,Xcode 将访问我的 Keychain 并获取此证书(注意:唯一的标识详细信息已被屏蔽或更改):

Keychain Certificate Common Name Example

正如您所看到的,Xcode 选择的黑色文本与我的证书中的“通用名称”字段完全匹配,因此 Xcode 将返回此证书及其关联的私钥以用于代码签名我的应用程序。

再回头看 Xcode 设置,我们还注意到此菜单选项中有更多文本 -- 浅灰色文本标识将构建到应用程序中的预配配置文件。在我的示例设置中,Xcode 将获取其 AppID 设置为 'com.myiosapp.*' 的预配配置文件“MyiOSApp Testing”。Xcode 对于储存预配配置文件非常贪心,幸运的是 Organizer 提供了一个很好的地方来查看已安装的预配配置文件并了解其所包含的基本数据。对于第一张图片中的 Xcode 代码签名身份,我的 Organizer 中相关的预配配置文件如下:

Organizer Provisioning Profile

'名称'列和 App 标识符列的末尾匹配了我 Xcode 设置中的浅灰色文本,因此这是将用于代码签名的预配配置文件。还要注意行末的 '状态' 列。在这种情况下,它是绿色的,表示“有效配置文件”。这意味着我的 Keychain 至少具有该预配配置文件中编码的证书的公钥和私钥之一。如果此状态不是绿色,则您当前的公钥/私钥和/或预配配置文件设置存在问题 - 只有将您正在尝试使用的预配配置文件的状态设置为绿色,才能进行代码签名。其他可能的状态选项包括:

Organizer Provisioning Status Options

  • 未找到有效的签名标识:您没有至少拥有一个证书编码在此配置文件中的公钥和私钥。请从“组织者”中删除配置文件,然后返回 developer.apple.com/ios 的“证书、标识符和配置文件”工具,确保您的开发证书已包含在配置文件中。在 Keychain Access 中验证您的证书是否未过期或被撤销,并且是否已将私钥链接到公钥证书上。
  • 配置文件已过期:配置文件的到期日期已过。请从“组织者”中删除此配置文件,然后重新签发此配置文件(如果实际上仍需要该配置文件),并返回 developer.apple.com/ios 的“证书、标识符和配置文件”工具。

其他可能会导致问题的因素

除了确保安装了公钥和私钥,并且配置文件设置正确之外,还有一些其他因素可能会使开发人员遇到问题。首先,Xcode会收集和保留配置文件直到您告诉它将其删除。在理论上,这不是一个超级大的问题,除非您对配置文件进行更改,下载并安装更新版本。许多时候,Xcode会选择正确的配置文件,但有时却会出现错误,导致您花费数小时查看“证书、标识符和配置文件”工具以及您的钥匙链,试图了解发生了什么。

建议1:在安装新版本的配置文件时,删除旧版本,以便Xcode不必做出决策。

如果您重新签发开发或分发证书,类似的情况也会发生——在构建期间,大多数时候Xcode会触发警告,指出存在模糊的证书。

建议2:在构建过程中注意模糊警告。这意味着您有一个旧的证书符合构建条件,并且可能会被无意中使用,从而导致构建问题。

建议3:每当您在Keychain中处理您的证书时,请查找带有红色“X”的“iPhone Developer: …”或“iPhone Distribution: …”证书。这表示该证书已过期或被撤销。无论如何,这个公钥(以及可能链接的私钥)对于构建目的已经没有用处,可以删除。

最后,Code Sign Identity设置还有一个名为“自动配置文件选择器”的选项。在许多情况下,您将希望使用此选项,因为它将尽力自动查找您的AppID是否与构建目标设置相对应,查找匹配该AppId并包含您具有公钥和私钥的证书的预配文件。在某些自定义构建情况下,可能无法使用此选项,您将不得不使用其中一个固定的特定选项,例如第一张图中的演示设置。请注意,如果您选择固定选项,则每次更新预配文件时,都需要更新代码签名身份生成设置以匹配更新版本。

要点总结

  • 确保您的Keychain和Xcode预配文件列表保持干净且去重。
  • 安装证书和预配文件后,请确保组织者将预配文件状态报告为绿色(“有效预配文件”)。任何其他状态都表示您的Keychain和预配文件之间存在问题,必须在考虑运行构建之前解决该问题。
  • 尝试使用“自动配置文件选择器”。如果您的队友和任何自动化构建系统也不需要考虑代码签名身份设置,他们会更加满意。
  • 如果无法使用自动配置文件选择器,请确保始终使该设置保持最新,以匹配您的预配文件的更新版本。

15
布赖恩...写一本书吧。可以吗? - Andrew Duncan
4
@AndrewDuncan :) 我需要更新这个现代的 Xcode 版本--请注意,Xcode 界面的某些部分已经略微更改,隐藏了我在 [不太小的] 回答中引用的 UI 元素,但是需要检查的事项仍然完全准确。如果遇到问题,请随时与我联系! - Bryan Musial
@BryanMusial,这是一个很好的解释。如何验证您的设备(例如您的Apple Watch)是否包含在Xcode设置要使用的开发配置文件中? - kzia
@kzia 这需要比这个评论框允许的更多字符; 提一个新的SO问题并在此处链接。很高兴给出答案。 - Bryan Musial

0

你只能使用证书签署你的应用程序。

该证书可以是以下之一:

  • dev 证书(用 Xcode 构建到你的物理设备中)
  • 企业证书(为员工构建)
  • 应用商店证书(为真实客户构建)

以下内容将列出您在 Mac 上可用于签名的证书。

security find-identity -p codesigning -v

我的示例返回:

1) A0D1B4FBH9768DA909766DC27D6882088A994473 "Apple Development: Mohammad F (5ABCS7TRT6)"
2) 5404044732CF2A011D95C28222DCF0000D3B84E "Apple Development: mfaani@foo.com (97ENL333NA)"

我的两个证书可以通过以下任一方式进行识别:

A0D1B4FBH9768DA909766DC27D6882088A994473 或 "Apple Development: Mohammad F (5ABCS7TRT6)"

5404044732CF2A011D95C28222DCF0000D3B84E 或 "Apple Development: mfaani@foo.com (97ENL333NA)"

摘要

代码签名标识是能够唯一标识您的证书的任何东西。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接