什么是代码签名身份?

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

他们是证书吗?

他们是私钥吗?

他们是应用ID吗?

他们是configuration文件?

如果我去目标构build设置,它要求代码签名的身份,所以我需要弄清楚这一点。

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

您已经确定了一个非常迅速变得非常深入的主题,并且在尝试进行iOS应用程序的设备构build时是常见的头痛问题。 首先,让我围绕代码签名过程中涉及的每个术语(对于您和任何人稍后都会绊倒这个问题)给出一个小结构,然后我们可以转向您的主要问题:

CodeSign术语

iOS设备构build的代码签名阶段是我们对应用程序中的数据进行encryption签名和保护的过程,包括应用程序可执行二进制本身,任何embedded式媒体资产(如button纹理,自定义graphics,字体等)。 )和一组关于我们应用程序的元数据,并代表我们应用程序数据的独特“指纹”。 这个指纹是Apple和iOS用来确保我们的应用程序在交付给用户设备或在用户的iOS设备上运行时不被篡改的。 要做到这一点,开发人员需要在苹果公司注册,设置应用标识符,请求开发和分发证书,注册一组testing设备,最后请求供应configuration文件进行开发。 每个元素的作用如下:

  • 应用程序标识符(或AppID) – 反向DNS风格的string,唯一标识AppStore上的一个iOS应用程序。
  • 开发和分发证书 – 这些是由苹果公司encryption签署的数字文件,certificate文件发给的个人的身份。 对于那些熟悉公钥基础设施的人来说,证书本身包含一个公钥,可以用来在后面的过程中validation签名的完整性。
  • testing设备 – 唯一通过iOS软件authentication的标准分销渠道是通过AppStore。 通过注册testing设备,开发人员可以规避AppStore并将软件直接安装到设备上进行开发和testing。 在给定的会员年度中允许的testing设备总数是100个testing设备。
  • 供应configuration文件 – 包含三个主要组件的文档:1)恰好一个应用程序ID,2)一个或多个iOS开发人员证书,以及3)可以直接安装指定iOS应用程序的零个或更多注册testing设备。 本文档的内容由苹果公司encryption签署,以确保其内容不被篡改。

这个文件和指纹检查的存在决定了开发者生成的应用程序是否可以安装到设备,因为它包含“谁”(证书),“什么”(AppID)和“哪里'(哪些设备)。

太好了,我知道了…现在Code Sign身份证呢?

在个别构build目标的构build设置的上下文中,术语代码标识标识是指安装在开发者机器的钥匙串中的那些证书的通用名称。 在Xcode构build设置中,它显示为开发人员必须select用于CodeSign的标识的选项列表 – 在此菜单的每个部分中都有很多编码信息:

Xcode代码标识标识

首先查看黑色文本 – 从“iPhone开发者:Bryan Musial(XXXXXXXXXX)”上面的图像中可以看出 – 这是Xcode用来查找用于Code Sign的公钥和私钥的主要项目。 当select这个项目时,你指示Xcode到达你的钥匙串,并试图find一个“Common Name”字段与该string匹配的证书,然后获取该证书(包含公钥)和相关的私钥以供代码签名操作。

如果您打开Keychain Access并双击任何“iPhone Development:…”或“iPhone Distribution:…”证书,将显示所有编码到Apple向其开发人员颁发的证书中的信息。 如果我要在第一张图片中select条目,Xcode将伸入我的钥匙串并取回此证书(注意:唯一标识的详细信息已被X或更改):

钥匙串证书通用名称示例

正如你所看到的,Xcodeselect中的黑色文本与我的证书中的Common Name字段完全匹配,所以Xcode将撤回此证书及其链接的私钥,以便在代码签名我的应用程序中使用。

再次回顾Xcode设置,我们也注意到在该菜单选项中还有更多的文本 – 较浅的灰色文本标识将被构build到应用程序中的供应configuration文件。 在我的示例设置的情况下,Xcode将去并获得其AppID设置为“com.myiosapp。*”的供应configuration文件“MyiOSApptesting”。 Xcode对存储configuration文件非常贪婪,幸运的是,Organizer为您提供了一个查看已安装的configuration文件的好地方,并了解它们包含的基本数据。 对于第一个图像中的Xcode Code Sign Identity,我的pipe理器中相关的Provisioning Profile将如下所示:

管理器配置文件

应用程序标识符列的“名称”列和尾部与我的Xcode设置中的浅灰色文本相匹配,因此这是在代码签名期间将被select使用的供应configuration文件。 注意行尾的“状态”栏也很重要。 在这种情况下,它是绿色的,并指示“有效的configuration文件”。 这意味着我的钥匙串至less有一个在该配给configuration文件中编码的证书的公钥和私钥。 如果此状态不是绿色,那么当前设置的公钥/私钥和/或configuration文件存在问题 – 代码签名无法工作,除非您尝试使用的configuration文件的状态设置为绿色。 其他可能的状态选项包括:

管理器配置状态选项

  • 找不到有效的签名标识:对于此提供configuration文件中编码的至less一个证书,您没有公钥和私钥。 从Organizer中删除configuration文件,然后返回到developer.apple.com/ios上的“证书,标识符和configuration文件”工具,并确保您的configuration文件中包含开发证书。 在钥匙串validation您的证书访问没有过期或撤销,并有一个私钥链接到公钥证书。
  • configuration文件已过期:configuration文件的到期date已过。 从pipe理器中删除此configuration文件,然后重新访问developer.apple.com/ios上的证书,标识符和configuration文件工具,并重新发布此configuration文件(如果实际上仍然需要)

其他项目,可以绊倒你

除了确保安装公钥和私钥的所有细节之外,以及configuration文件设置恰到好处之外,还有其他一些事情可能会使开发人员感到不安。 首先,Xcode收集供应configuration文件并挂起,直到您告诉它们将其删除。 从理论上讲,除非您更改供应configuration文件,下载并安装更新的版本,否则这不是一个超级大交易。 很多时候,Xcode会抓住正确的configuration文件,但是有时候它并不正确,你会花几个小时看看证书,标识符和configuration文件工具以及你的钥匙串,试图了解发生了什么。

build议1:在安装更新版本的configuration文件时,删除旧configuration文件,以便Xcode不会被置于可能需要做出决定的位置。

如果您重新发布开发或分发证书,则可能会发生类似的情况 – 大多数情况下,Xcode在构build模糊证书时会触发警告。

build议2:在构build期间注意模糊警告。 这意味着你有一个旧的证书,满足构build条件,可能会被无意中使用,可能会导致构build问题。

build议3:任何时候你在钥匙链处理你的证书,寻找“iPhone开发者:…”或“iPhone分发:…”证书,其上有一个红色的“X”。 这是证书已过期或已被吊销的指标。 无论哪种方式,这个公共密钥(和可能连接的私钥)是没有进一步用于build设目的,可以删除。

最后,“代码标识标识”设置也有一个选项,列出为“自动configuration文件select器”。 在许多情况下,您会希望使用此选项,因为它将尽最大努力从构build目标的设置中自动查找您的AppID,查找与该AppId相匹配的配给configuration文件,并包含您拥有公钥和私钥的证书。 在一些自定义的构build环境中,可能无法使用这个选项,你将不得不使用其中一个固定的特定选项,比如我在第一个图像中的演示设置。 请注意,如果您使用固定选项,则只要您更新配给configuration文件,则还需要更新“代码签名标识”生成设置以匹配较新的版本。

关键要点

  • 确保您的Keychain和Xcodeconfiguration文件列表保持清洁和重复数据删除。
  • 安装证书和供应configuration文件后,请确保组织者将供应configuration文件的状态报告为绿色(“有效configuration文件”)。 任何其他状态都表示在您考虑运行构build之前,需要解决的Keychain和Provisioningconfiguration文件之间存在问题。
  • 尝试使用“自动configuration文件select器”。 如果您的团队和自动构build系统不需要考虑代码标识身份设置,那么您的团队和自动构build系统将会更加愉快。
  • 如果您无法使用自动configuration文件select器,请确保始终保持该设置的最新状态,因为您的configuration文件的更新迭代已经完成。

祝你的构buildconfiguration,请让我知道,如果你有任何其他跟进问题!