43

我已经查看了已经存在的问题,但没有一个问题能够解决我的问题(比如重新创建证书)。我已经构建了一个应用程序,在该应用程序内部我几乎没有可执行文件、文件夹和框架。每当我尝试做codesign -s "our identity" my.app总是找不到身份。有人可以给出一个逐步的过程。

codesign -s "Developer ID Application: Sai***** (123123123J)" out/Release/Sai.app

错误

开发者ID申请:Sai******(123123123J):未找到身份,

我尝试删除“开发者 ID 应用程序”和序列号,但一切都给出了相同的错误

在这些方面寻求帮助

4

5 回答 5

61

我也遇到了一些麻烦。仔细检查您的代码签名身份是否在您的钥匙串中,您可能会考虑使用 SHA-1 指纹而不是 -s 后面的名称。

您可以通过打开Keychain Access并选择您的Developer ID Application: FOO证书,然后选择Get Info来找到 SHA-1 指纹。从这里,滚动到信息的底部,直到到达Fingerprints。可以复制此处的 SHA-1 指纹,您必须删除所有空格,但之后您将拥有一个 40 个字符的标识符,该标识符适合放置-s在您的协同设计语句中。

如果您仍然无法找到密钥,请从终端尝试以下操作:

certtool y | grep Developer\ ID

Developer ID Application并在 中查找任何内容Common Name以验证证书实际上是否位于可从终端访问的钥匙串中。如果您没有看到任何响应,则表明包含您的凭据的钥匙串对您的Terminal会话不可用。造成这种情况的原因包括钥匙串被锁定、shell 以另一个用户身份运行、以不同的权限执行命令(例如sudo)。

执行上述命令后,您至少应该拥有以下内容:

Developer ID Application: <your company name>
Developer ID Installer: <your company name>
Developer ID Certification Authority

如果你没有这三个,你应该去下载缺少的元素。尽管您目前可能不需要构建安装程序,但拥有它并没有什么坏处。应用程序和安装程序元素可以从Apple 开发人员网站上的证书、标识符和配置文件选项卡的Mac 证书部分下载。您应该有未过期的列表。您可能也有已过期的列表。要在钥匙串中安装证书:

  1. 访问Apple 开发者网站
  2. 访问Mac 开发中心
  3. 访问证书、标识符和配置文件链接
  4. 从门户下载证书
  5. 双击证书和钥匙串访问应该打开
  6. 允许 Keychain Access 将证书添加到您的 Keychain

Developer ID 证书颁发机构应该已经由 Xcode 安装,但如果不是,您可以自己安装。您需要从Developer ID Authority单独下载,或单击 证书选项卡中的+链接并使用底部的链接下载证书。

这也是确保您拥有Apple Worldwide Developer Relations Certification Authority的好时机,这是一些签名工具的基础。它应该通过 Xcode 安装程序安装在您的系统钥匙串中,并且可以直接从上面证书选项卡中的+链接或从Apple WWDR CA下载。

根据 Apple 的App Distribution Guide,有适用于每个证书和密钥的特定钥匙串:

  • 您的私钥和签名证书(Developer ID InstallerDeveloper ID Application和 App Store Certificates)应该在您的登录钥匙串中
  • Apple Worldwide Developer Relations 证书颁发机构和Developer ID 证书颁发机构属于系统钥匙串
  • 您的开发者证书也属于您的登录钥匙串

钥匙扣维护

因为 Xcode 会自动操作钥匙串,并且因为某些证书会在配置文件更改时定期重新颁发(尽管不是针对 Developer ID,因为它具有多年证书并且不需要配置文件),您最终可能会传播不必要的并且可能会混淆您钥匙串中的证书。当它们过期时清除它们是个好主意,因为它们会给 Xcode 带来一些混乱。

警告

  • 在对钥匙串进行任何维护之前,请确保您已备份钥匙串
  • 此过程旨在删除与开发相关的不必要证书,如果证书不以Mac Developer3rd Party Mac DeveloperiPhone DeveloperDeveloper ID开头,此时不要乱用它们。如果您不小心删除了您通过电子邮件收到的证书(例如),即使它已过期,您也可能无法阅读您收到的电子邮件。

要做的事情:

  1. 退出 Xcode
  2. 运行 Keychain First Aid(来自Keychain Access)并验证您的钥匙串是否正常
  3. 单击左侧边栏上的证书类别
  4. 找到上述类型的任何过期的开发人员证书。它们将在右下角显示一个小X。
  5. 选择您将要删除的证书并使用File > Export Items...备份它们
  6. 把这个文件放在一个安全的地方,并给它一个好的密码
  7. 删除您已备份的证书
  8. 查看您剩余的证书并验证您是否拥有上一节中提到的证书。如果不这样做,则需要下载并可能续订它们。
  9. 验证证书是否在上面指定的钥匙串中(例如,您的所有签名证书都应该在您的登录钥匙串中)
于 2013-04-16T13:14:50.350 回答
30

虽然我没有为苹果开发代码签名这样做,但我仍然认为我有一些有价值的东西可以帮助你调试这样的问题。不同之处在于我创建了自己的证书,而您从苹果获得了证书。

检查证书的信任度,它必须受信任才能进行代码签名(在钥匙串访问中证书视图信任部分的倒数第三个 yosemite 上)。请注意,对于您的代码签名证书应该在登录钥匙串中,我需要它在系统钥匙串中。

起初,证书对钥匙串的代码签名并不为人所知,因为缺少扩展目的“代码签名”,如果您查看钥匙串并双击证书,您可以找到它:

在此处输入图像描述

我解决了这个问题(您无法修复它,因为 Apple 向您提供了证书。扩展程序应该就在那里):

在此处输入图像描述

然后,在将证书从钥匙串拖放到我的桌面后,我将证书添加到受信任的签名证书中,这创建了 ~/Desktop/gdb-cert.cer(请注意,您可以省略 -d 和 -r trustRoot:

$ sudo security add-trusted-cert -d -r trustRoot -p codeSign -k /Library/Keychains/System.keychain ~/Desktop/gdb-cert.cer

这有点棘手,因为我被一些互联网帖子误导并且没有查看手册页。有人说你应该使用 add-trust ( https://llvm.org/svn/llvm-project/lldb/trunk/docs/code-signing.txt )。可怕的是命令成功了,但没有做它应该做的事情。

之后,我在受信任的证书中找到了新证书,如下所示:

$ security find-identity -p codesigning

Policy: Code Signing
  Matching identities
      1) E7419032D4..... "Mac Developer: FirstName LastName (K2Q869SWUE)"    (CSSMERR_TP_CERT_EXPIRED)
      2) ACD43B6... "gdb-cert"
  2 identities found

  Valid identities only
      1) ACD43... "gdb-cert"
  1 valid identities found

在我的情况下,苹果证书已过期,但我用来签署 gdb 的证书没有过期(好吧,我只是自己创建的)。另请注意,“security add-trusted-cert”(-p codeSign)和“security find-identity”命令(-p codesigning)的策略名称不同。然后我继续签署 gdb,我也总是得到:

$ codesign --sign gdb-cert.cer --keychain ~/Library/Keychains/login.keychain `which gdb`
  gdb-cert.cer: no identity found

因为我的印象是我必须将证书文件的文件名提供给 --sign 选项,但实际上这是我应该提供的证书的 CN,并且应该在信任库中。双击钥匙串中的证书时,您可以在此处找到 CN:

在此处输入图像描述

或在“security find-identity -p codesigning”的上述输出中。然后我继续签名,我必须给它正确的钥匙链。在您的情况下,这必须是 ~/Library/Keychains/login.keychain,在我的情况下是 System.keychain:

 codesign -s gdb-cert --keychain /Library/Keychains/System.keychain `which gdb` 

然后给了我一个工作的 gdb,它应该给你一个签名的应用程序。

于 2015-09-03T15:34:00.163 回答
11

答案最后很简单。我的私钥丢失了。为此,我撤销了证书并按照开发人员程序中的步骤进行操作(特别是在此过程中创建 CSR 证书,我没有多次获得,除非我撤销了证书)。

于 2013-05-21T13:56:56.227 回答
3

甚至

certtool y | grep "Developer ID Application: xxxx"

无法显示任何结果,我猜这是访问所需钥匙串的问题。所以首先我验证,私钥可以被钥匙串本身中的任何应用程序访问,然后我开始使用k=/Users/myUser/Library/Keychains/login.keychaincerttool 命令中的选项,因为这成功了,我做了同样的事情

codesign --keychain /Users/myUser/Library/Keychains/login.keychain --force --verbose -s "Developer ID Application: xxxx"

于 2013-04-29T15:07:17.470 回答
0

甚至

certtool y | grep "Developer ID Application: xxxx"

无法显示任何结果,我猜这是访问所需钥匙串的问题。所以首先我验证,私钥可以被钥匙串本身中的任何应用程序访问,然后我开始使用k=/Users/myUser/Library/Keychains/login.keychaincerttool 命令中的选项,因为这成功了,我做了同样的事情

codesign --keychain /Users/myUser/Library/Keychains/login.keychain --force --verbose -s "Developer ID Application: xxxx
于 2019-12-14T14:19:04.727 回答