codesign通过终端始终没有发现身份错误

时间:2013-04-16 12:04:09

标签: macos osx-snow-leopard code-signing

我查看了已经存在的问题,但没有解决我的问题(比如重新创建证书)。我已经构建了一个应用程序,在应用程序内部我有几个可执行文件和文件夹和框架。每当我尝试编码--s“我们的身份”时,my.app始终没有找到任何身份。有人可以一步一步地给出这个过程。

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

错误

Developer ID Application: Sai****** (123123123J): no identity found,

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

在这些lines

中寻求帮助

谢谢

5 个答案:

答案 0 :(得分:52)

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

您可以通过打开Keychain Access并选择Developer ID Application: FOO证书,然后选择获取信息来找到SHA-1指纹。在此处,滚动到信息的底部,直至到达指纹。此处的SHA-1指纹可以复制,您必须删除所有空格,但之后您将拥有一个40个字符的标识符,该标识符适合放在您的codesign语句中-s之后。< / p>

如果您在查找密钥时仍遇到问题,请在终端中尝试以下操作:

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

如果你没有全部三个,你应该去下载缺少的元素。虽然您目前可能需要来构建安装程序,但使用它并没有什么坏处。可以从证书,标识符和&amp;部门的 Mac证书部分下载应用程序和安装程序元素。 Apple's Developer site上的个人资料标签。您应该在那里没有过期的列表。您可能还有已过期的商家信息。要在您的钥匙串中安装证书:

  1. 访问 Apple开发者网站
  2. 访问 Mac开发中心
  3. 访问证书,标识符和&amp;个人资料链接
  4. 从门户网站下载证书
  5. 双击证书和钥匙串访问权限应该打开
  6. 允许Keychain Access将证书添加到您的Keychain
  7. 开发者ID证书颁发机构应该由Xcode安装,但如果不是,则可以自行安装。您需要从Developer ID Authority单独下载,或者点击证书标签中的 + 链接,然后使用底部的链接下载证书。< / p>

    这也是确保您拥有 Apple全球开发者关系认证中心的好时机,这是一些签名工具的基础。它应该安装在系统钥匙串中,由Xcode安装程序安装,并且可以直接从上面证书标签中的 + 链接下载或从Apple WWDR CA

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

    • 您的私钥和签名证书(开发者ID安装程序开发者ID应用程序和App Store证书)应位于登录 keychain
    • Apple全球开发者关系认证中心开发者ID认证中心属于系统钥匙串
    • 您的开发者证书也属于登录钥匙串

    钥匙串维护

    因为Xcode会自动操作钥匙串,并且因为在配置文件更改时会定期重新颁发某些证书(虽然不适用于开发人员ID,因为它具有多年证书并且不需要配置文件),您最终可能会在您的钥匙串中传播不必要且可能令人困惑的证书。最好在它们过期时将它们清理干净,因为它们会给Xcode带来一些混乱。

    <强>警告

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

    要做的事情:

    1. 退出Xcode
    2. 运行钥匙串急救(来自钥匙串访问)并验证您的钥匙串是否正常
    3. 点击左侧边栏上的证书类别
    4. 找到上述种类的所有过期开发者证书。它们会在右下角显示一个小的 X
    5. 选择要删除的证书,然后使用文件&gt;进行备份。导出项目......
    6. 将此文件放在安全的地方并给它一个好的密码
    7. 删除已备份的证书
    8. 查看剩余的证书,并确认您拥有上一节中提到的证书。如果您没有,则需要下载并可能续订。
    9. 验证证书是否在上面指出的钥匙串中(例如,您的所有签名证书都应在登录钥匙串中)

答案 1 :(得分:22)

虽然我没有为苹果开发代码签名做这个,但我仍然认为我有一些有价值的内部可以帮助你调试这样的问题。不同的是,当你从苹果公司获得证书时,我创建了自己的证书。

检查证书的信任度,必须信任代码签名(在优胜美地上,这是密钥链访问中证书视图的信任部分中的第三个)。请注意,对于您的代码签名,证书应该在登录密钥链中,我需要在系统密钥链中。

起初,证书不知道是否与钥匙串协商,因为缺少扩展目的“代码签名”,如果你查看钥匙串并双击证书,你可以找到它:

enter image description here

我修正了(你无法修复它,因为Apple为你提供了证书。扩展应该就在那里):

enter image description here

然后我将证书添加到受信任的签名证书中,之后我将证书从钥匙串拖放到我的桌面,创建了〜/ 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

在我的情况下,apple证书已过期,但我用来签署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

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

enter image description here

或在“security find-identity -p codesigning”的上述输出中。然后我继续签名,我不得不给它正确的钥匙串。在你的情况下,这将是〜/ Library / Keychains / login.keychain,在我的例子中是System.keychain:

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

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

答案 2 :(得分:8)

答案终于很简单了。我的私钥丢失了。 为此,我撤销了证书,并按照其在开发人员计划中的步骤(特别是在此过程中创建了CSR证书,除非我撤销证书,否则我没有多次获得证书)。

答案 3 :(得分:3)

甚至

certtool y | grep "Developer ID Application: xxxx"

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

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

答案 4 :(得分:0)

甚至

certtool y | grep "Developer ID Application: xxxx"

无法显示任何结果,我想这是访问所需钥匙串的问题。因此,我首先进行了验证,私钥可以被钥匙串本身中的任何应用程序访问,然后我开始在certtool命令中使用k=/Users/myUser/Library/Keychains/login.keychain选项,并在成功之后对

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