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

Sai*_*hna 34 macos code-signing osx-snow-leopard

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

codesign -s "Developer ID Application: Sai***** (123123123J)" out/Release/Sai.app
Run Code Online (Sandbox Code Playgroud)

错误

Developer ID Application: Sai****** (123123123J): no identity found,
Run Code Online (Sandbox Code Playgroud)

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

寻求这些方面的帮助

谢谢

gai*_*ige 53

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

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

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

certtool y | grep Developer\ ID
Run Code Online (Sandbox Code Playgroud)

并查找带有任何Developer ID ApplicationCommon Name验证证书实际上是在钥匙链是由终端进行访问.如果您没有看到任何响应,则表明包含您的凭据的钥匙串对您的Terminal会话不可用.这样做的原因包括锁定钥匙串,作为另一个用户运行的shell,以不同的权限执行命令(例如sudo).

执行上述命令后,您应至少具备以下条件:

Developer ID Application: <your company name>
Developer ID Installer: <your company name>
Developer ID Certification Authority
Run Code Online (Sandbox Code Playgroud)

如果你没有这三个,你应该去下载缺少的元素.虽然您目前可能不需要构建安装程序,但是使用安装程序并没有什么坏处.可以从Apple开发人员站点上的" 证书,标识符和配置文件"选项卡的" Mac证书"部分下载应用程序和安装程序元素.您应该在那里没有过期的列表.您可能还有已过期的商家信息.要在钥匙串中安装证书,请执行以下操作:

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

开发者ID认证机构应该已经安装了Xcode的,但如果不是这样,你可以自行安装.您需要单独从Developer ID Authority下载它,或者单击Certificates选项卡中的 +链接并使用底部的链接下载证书.

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

根据Apple的应用程序分发指南,有适用于每个证书和密钥的特定钥匙链:

  • 您的私钥和签名证书(开发者ID安装程序,开发者ID应用程序和App Store证书)应该在您的登录密钥链中
  • 苹果全球开发者关系的证书颁发机构开发者ID认证机构属于在系统钥匙串
  • 您的开发人员证书也属于您的登录密钥链

钥匙扣维护

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

警告

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

要做的事:

  1. 退出Xcode
  2. 运行Keychain First Aid(来自Keychain Access)并验证您的钥匙串是否正常
  3. 单击左侧栏上的" 证书类别"
  4. 找到上述类型的任何过期的开发人员证书.他们会在右下角出现一个小X.
  5. 选择要删除的证书,然后使用文件>导出项目进行备份...
  6. 将此文件放在安全的地方,并给它一个很好的密码
  7. 删除已备份的证书
  8. 查看剩余的证书并验证您是否拥有上一节中提到的证书.如果不这样做,您需要下载并可能续订.
  9. 验证证书是否在上面指出的密钥链中(例如,您的所有签名证书都应在您的登录密钥链中)


use*_*338 23

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

检查证书的信任,必须信任代码签名(在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
Run Code Online (Sandbox Code Playgroud)

This was a bit tricky because I was mislead by some internet posts and did not look at the man page. Some said you should use add-trust (https://llvm.org/svn/llvm-project/lldb/trunk/docs/code-signing.txt). The terrible bit was that the command succeeded, but did not do what it should.

After that I found the new cert in the trusted certs like so:

$ 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
Run Code Online (Sandbox Code Playgroud)

In my case the apple cert is expired, but the one I was using to sign gdb was not (well, I just created it myself). Also be aware that the policy is named differently for the "security add-trusted-cert"(-p codeSign) and the "security find-identity" command (-p codesigning). I then went on to sign gdb and I also always got:

$ codesign --sign gdb-cert.cer --keychain ~/Library/Keychains/login.keychain `which gdb`
  gdb-cert.cer: no identity found
Run Code Online (Sandbox Code Playgroud)

因为我的印象是我必须将cert文件的文件名提供给--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` 
Run Code Online (Sandbox Code Playgroud)

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

  • 我得到'SecTrustSettingsSetTrustSettings:传递给函数的一个或多个参数无效.' (3认同)

Sai*_*hna 9

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

  • 不知道你为什么撤销我的答案.我在回答中说的绝对第一件事就是"检查你的代码签名身份是否在你的钥匙串中",我后来做了具体的参考,以验证你的私钥所在的钥匙串以及如何撤销和重新安装它.但是不要紧.干杯. (2认同)