终端中使用codesign始终出现“未找到身份验证”的错误

43

我已经查看了现有的问题,但没有一个解决了我的问题(比如重新创建证书)。我构建了一个应用程序,在应用程序中有几个可执行文件、文件夹和框架。每当我尝试执行codesign -s "our identity" my.app时,总是提示找不到身份。可以有人提供一步一步的过程吗?

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

错误

开发者ID应用程序:Sai******(123123123J):未找到身份信息,

我尝试删除“Developer ID Application”和序列号,但仍出现相同的错误

在这些中寻求帮助


你手动进行了应用程序代码签名吗?如果是这样,请展示整个codesign命令行以及任何参数和准确的错误消息。 - gaige
1
嗨,我刚刚更新了我的问题,并附上了所有的命令。 - J Bourne
请参见 https://dev59.com/EVwX5IYBdhLWcg3w-Thv#38024216 - ryenus
5个回答

62

我也遇到过这个问题。请确认您的代码签名身份是否在钥匙串中,并考虑使用SHA-1指纹而不是名称后面的-s。

您可以通过打开Keychain Access并选择您的Developer ID Application: FOO证书,然后选择“获取信息”来查找SHA-1指纹。从这里,向下滚动信息直到您看到“指纹”。这里的SHA-1指纹可以复制,但您必须删除所有空格,之后您将获得一个40个字符的标识符,适合放置在codesign语句中的-s后面。

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

certtool y | grep Developer\ ID

搜索任何一个 Common Name 中带有 Developer ID Application 的内容,以验证证书是否实际上位于可从终端访问的钥匙串中。如果没有看到任何响应,则表示包含您凭据的钥匙串对您的 Terminal 会话不可用。原因可能包括锁定钥匙串,以其他用户身份运行shell,使用不同权限(例如 sudo )执行命令。

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

Developer ID Application: <your company name>
Developer ID Installer: <your company name>
Developer ID Certification Authority
如果您没有所有三个元素,您应该去下载缺失的元素。虽然您目前可能不需要构建Installer,但保留它也没有坏处。应用程序和Installer元素可以从“证书、标识符和配置文件”选项卡上的“Mac证书”部分中下载,其位于Apple开发者网站上,您应该有未过期的列表,也可能有已过期的列表。要将证书安装到钥匙串中:
  1. 访问 Apple开发者网站
  2. 访问 Mac Dev Center
  3. 访问 证书、标识符和配置文件链接
  4. 从门户下载证书
  5. 双击证书,Keychain Access应该会打开
  6. 允许Keychain Access将证书添加到您的Keychain中。
如果Xcode没有安装“Developer ID Certification Authority”,则应该自行安装。您需要从Developer ID Authority下载或单击“证书”选项卡中的“+”链接并使用底部的链接下载证书。
同时,请确保您拥有“Apple Worldwide Developer Relations Certification Authority”,它是某些签名工具的基础。它应该安装在您的系统钥匙串中,由Xcode安装程序安装,并可直接从上面的+链接或Apple WWDR CA下载。
根据苹果公司的App Distribution Guide,适用于每个证书和密钥的特定钥匙串:
  • 您的私钥和签名证书(Developer ID InstallerDeveloper ID Application和App Store Certificates)应该在登录钥匙串中。
  • Apple Worldwide Developer Relations Certification AuthorityDeveloper ID Certification Authority属于系统钥匙串。
  • 您的开发人员证书也应该在您的登录钥匙串中。

钥匙串维护

因为Xcode自动操作钥匙串,并且因为某些证书会随着配置文件的更改而定期重新发行(虽然不适用于Developer ID,因为它具有多年期证书并且不需要配置文件),所以您可能会在钥匙串中遇到一些无关紧要和潜在混乱的证书。清理过期的证书是个好主意,因为它们可能会给Xcode带来一些混乱。 警告
  • 在对您的钥匙串进行任何维护之前,请确保备份了您的钥匙串。
  • 此过程旨在删除与开发相关的不必要证书,如果证书名称不以Mac Developer3rd Party Mac DeveloperiPhone DeveloperDeveloper ID开头,请勿在此时删除它们。如果您意外删除了通过电子邮件获得的证书(例如),即使它已经过期,您也可能无法阅读接收到的电子邮件。
要做的事情:
  1. 退出Xcode

嗨gaige,我尝试了钥匙串修复,它说没有发现问题。 - J Bourne
哦,我无法在Xcode中打开这个项目,因为它的大小为25GB。我的CPU是双核心,内存为10GB。 - J Bourne
@SaiKrishna,我已经添加了几个诊断步骤来验证您的“终端” shell 中可用的钥匙串是否包含您从 shell 签名的证书,请您检查一下这些步骤。 - gaige
有没有想过如何通过SSH进行“codesign”(用于无人值守构建),而不必以明文形式存储登录钥匙串密码? - dkl
1
@giaige 的后续:如果我使用非登录钥匙串,我可以让SSH签名工作。是的,我得为这个钥匙串存储密码,但它只包含签名材料,所以我不太担心。 - dkl
显示剩余11条评论

31

虽然我没有为苹果开发代码签名做过这件事,但我仍然认为我有一些宝贵的经验可以帮助您调试此类问题。不同之处在于,我自己创建了证书,而您是从苹果获得的。

检查证书的信任状态,它必须受信任以进行代码签名(在Yosemite上,这是证书视图中信任部分的倒数第三个)。请注意,对于您的代码签名,证书应该在登录钥匙串中,而我需要它在系统钥匙串中。

首先,证书在密钥串中未知用于代码签名,因为缺少扩展目的“代码签名”,如果您查看证书并双击它,就会发现这一点:

enter image description here

我解决了这个问题(您无法解决它,因为苹果向您提供证书。扩展名应该只存在):

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

在我的情况下,苹果证书已过期,但我用于签署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,也应该能给你一个签名的应用程序。


这帮助我对我的gdb安装进行代码签名。谢谢! - adino
3
我收到了 'SecTrustSettingsSetTrustSettings: One or more parameters passed to a function were not valid.' 的信息。意思是所传递给该函数的一个或多个参数无效。 - tofutim
“one or more param not valid” 有什么进展了吗? - Drew
如果您只需要用于测试目的的自签名证书(就像我的情况一样),则可以使用Keychain Access工具,并按照此处报告的说明进行操作:https://dev59.com/e4bca4cB1Zd3GeqPQw3x - Bemipefe
我知道已经过去2年了,但是无论谁发现并看到“参数无效”的问题,请尝试将“trustRoot”更改为“trustAsRoot”。 - Valentyn Vynogradskiy

11

答案最终非常简单。我的私钥丢失了。 因此,我撤销了证书,并按照开发者计划中的步骤进行操作(特别是在该过程中创建CSR证书,除非我撤销了证书,否则我不会获得该证书)。


2
不确定为什么您撤销了我的答案。我在答案中绝对首先提到的是“检查您的代码签名标识是否在您的钥匙串中”,并且稍后还特别提到了验证您的私钥所在的钥匙串以及如何撤销和重新安装它。但是,无论如何,祝福您。 - gaige
好的,对此很抱歉..!只是希望用户知道确切的答案。这并不是为了得分,也不是要表明你的回答是错的..! - J Bourne
如何确定我的私钥是否丢失?它是如何指定的? - Joel
1
这是一个很好的答案。我购买了一台新的Mac Mini构建机来替换旧的机器。旧机器上有签名证书。仅导入从Apple下载的签名证书并不能起作用,我还需要原始私钥,该私钥用于形成证书请求。因此,我遵循了https://dev59.com/zFsX5IYBdhLWcg3wPdbm#34063997的步骤导出了新的密钥链并使用它。 - Dan Gravell
这也是我的问题。在执行CSR和获取证书之间,我的钥匙链出了点问题,我的密钥在途中丢失了。幸运的是,我有一个损坏的钥匙链备份,并在其中找到了私钥。 - rfay

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"


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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接