虽然我没有为苹果开发代码签名做过这件事,但我仍然认为我有一些宝贵的经验可以帮助您调试此类问题。不同之处在于,我自己创建了证书,而您是从苹果获得的。
检查证书的信任状态,它必须受信任以进行代码签名(在Yosemite上,这是证书视图中信任部分的倒数第三个)。请注意,对于您的代码签名,证书应该在登录钥匙串中,而我需要它在系统钥匙串中。
首先,证书在密钥串中未知用于代码签名,因为缺少扩展目的“代码签名”,如果您查看证书并双击它,就会发现这一点:
![enter image description here](https://istack.dev59.com/xA8Zr.webp)
我解决了这个问题(您无法解决它,因为苹果向您提供证书。扩展名应该只存在):
![enter image description here](https://istack.dev59.com/4Ulnq.webp)
然后,我将证书添加到受信任的签名证书中,此前我已经从钥匙串拖放证书到桌面,这创建了~/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:
![图片描述](https://istack.dev59.com/Ib6hc.webp)
或者在“security find-identity -p codesigning”的输出中可以找到。然后,我继续签署文件,并且必须为其提供正确的钥匙串。在您的情况下,这必须是~/Library/Keychains/login.keychain,在我的情况下是System.keychain:
codesign -s gdb-cert --keychain /Library/Keychains/System.keychain `which gdb`
那样给了我一个可用的GDB,也应该能给你一个签名的应用程序。
codesign
命令行以及任何参数和准确的错误消息。 - gaige