【问题标题】:What are code signing identities?什么是代码签名身份?
【发布时间】:2013-04-06 11:06:35
【问题描述】:

什么是 XCode 中的“代码签名身份”?

它们是证书吗?

它们是私钥吗?

它们是应用 ID 吗?

它们是配置文件吗?

如果我转到目标构建设置,它会询问代码签名身份,所以我需要弄清楚这一点。

我以为我们使用我们的私钥签署了代码。但是,我的私钥名称都没有出现。它显示了证书列表(我认为,虽然我什至不确定。)

【问题讨论】:

    标签: xcode4.5


    【解决方案1】:

    您肯定遇到了一个很快就会变得非常深入的话题,并且在尝试构建 iOS 应用程序的设备时,这是一个常见的头痛来源。首先,让我围绕代码签名过程中涉及的每个术语(包括您和以后遇到此问题的任何人)提出一个小结构,然后我们可以转向您的主要问题:

    CodeSign 术语

    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)和'Where'(哪些设备)。

    太好了,我明白了...现在这个代码符号身份的东西怎么样?

    在单个构建目标的构建设置的上下文中,术语代码签名身份是指安装在开发者机器的钥匙串中的那些证书的通用名称。在 Xcode 构建设置中,它显示为一个选项列表,开发人员必须从中选择要用于 CodeSign 的身份 - 此菜单的每个部分中都有大量编码信息:

    首先看黑色文本 - 来自上图中的“iPhone 开发人员:Bryan Musial (XXXXXXXXXX)” - 这确实是 Xcode 用于查找用于 Code Sign 的公钥和私钥的主要项目。选择此项目时,您将指示 Xcode 进入您的钥匙串并尝试查找其“通用名称”字段与该字符串匹配的证书,然后获取该证书(其中包含公钥)和关联的私钥以用于代码签名操作。

    如果您打开 Keychain Access 并双击任何“iPhone 开发:...”或“iPhone 分发:...”证书会显示 Apple 向其颁发的证书中编码的所有信息。开发商。如果我要选择第一张图片中的条目,Xcode 将进入我的钥匙串并拉回此证书(注意:唯一标识详细信息已被删除或更改):

    如您所见,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 将如下所示:

    “名称”列和 App Identifier 列的尾端与我的 Xcode 设置中的浅灰色文本匹配,因此这是在代码签名期间选择使用的配置文件。注意行尾的“状态”列也很重要。在这种情况下,它为绿色并指示“有效配置文件”。这意味着我的钥匙串至少有一个在该配置文件中编码的证书的公钥和私钥。如果此状态不是绿色,则说明您当前的公钥/私钥设置和/或配置文件存在问题——除非您尝试使用的配置文件的状态设置为绿色,否则代码签名无法工作.其他可能的状态选项包括:

    • 未找到有效的签名身份:您没有在此配置文件中编码的至少一个证书的公钥和私钥。从 Organizer 中删除配置文件,然后返回 developer.apple.com/ios 上的证书、标识符和配置文件工具,并确保您的开发证书包含在配置配置文件中。验证您在 Keychain Access 中的证书没有过期或被吊销,并且有一个与公钥证书相关联的私钥。
    • 配置文件已过期:配置文件的过期日期已过。从 Organizer 中删除此配置文件,然后重新访问 developer.apple.com/ios 上的证书、标识符和配置文件工具并重新发布此配置文件(如果仍然需要它)

    其他可能会绊倒你的物品

    除了确保您已安装公钥和私钥以及配置文件设置得恰到好处的所有细微差别之外,还有一些其他事情可能会让开发人员感到困惑。首先,Xcode 收集 Provisioning Profiles 并保留它们,直到您告诉它删除它们。从理论上讲,这并不是什么大不了的事情,除非您更改配置文件、下载并安装更新版本。很多时候 Xcode 会获取正确的配置文件,但有时它不会正确处理,您将花费数小时查看证书、标识符和配置文件工具以及您的钥匙串,以尝试了解正在发生的事情。

    建议 1:在安装更新版本的 Provisioning Profile 时,删除旧版本,这样 Xcode 就不会处于需要做出决定的位置。

    如果您重新颁发开发或分发证书,可能会发生类似的情况——大多数情况下,Xcode 会在构建期间触发关于不明确证书的警告。

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

    建议 3: 每当您在 Keychain 中处理您的证书时,请查找带有红色“X”的“iPhone 开发人员:...”或“iPhone 分发:...”证书在他们。这是证书已过期或已被吊销的指示符。无论哪种方式,此公钥(以及可能链接的私钥)都不再用于构建目的,并且可以删除。

    最后,代码符号身份设置还有一个选项,列为“自动配置文件选择器”。在许多情况下,您将希望使用此选项,因为它会尽力从构建目标的设置中自动查找您的 AppID,查找与该 AppId 匹配并包含您拥有公钥和私钥的证书的配置文件.在某些自定义构建情况下,可能无法使用此选项,您必须使用其中一个固定的特定选项,例如我在第一张图片中的演示设置。如果您使用固定选项,请注意 - 每当您更新配置文件时,您还需要更新代码签名身份构建设置以匹配较新的版本。

    要点

    • 确保您的 Keychain 和 Xcode Provisioning Profile 列表保持干净和重复数据删除。
    • 安装证书和配置文件后,确保组织者将该配置文件的状态报告为绿色(“有效配置文件”)。任何其他状态都表明您的钥匙串和配置文件之间存在问题,需要在您考虑运行构建之前解决。
    • 尝试使用“自动配置文件选择器”。如果您的队友和任何自动构建系统也不必考虑代码签名身份设置,他们就会对您更满意。
    • 如果您无法使用自动配置文件选择器,请确保您始终保持该设置是最新的,因为您的配置文件进行了更新的迭代。

    祝您的构建配置好运,如果您有任何其他后续问题,请告诉我!

    【讨论】:

    • 布赖恩...写一本书。请问?
    • @AndrewDuncan :) 我需要为现代 Xcode 更新这个——请记住,Xcode 界面的某些部分已经发生了轻微变化,隐藏了我的 [不是那么小] 答案中引用的 UI 元素,但是要检查的东西仍然是 100% 准确的。如果您遇到问题,请向我提问!
    • @BryanMusial,这是一个很好的解释。验证您的设备(例如您的 Apple Watch)是否包含在您的 Xcode 设置使用的开发配置文件中的步骤是什么?
    • @kzia 这将占用比此评论框允许的更多字符;问一个新的 SO 问题并将其链接到此处。很高兴给它一个答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-08
    • 1970-01-01
    • 2017-01-12
    相关资源
    最近更新 更多