我正在测试库的发布过程。该过程需要在Jail Broken iOS设备上进行测试。为此,我使用旧的iPad 1运行iOS 5.1监狱,并使用RedSn0w。
RedSn0w没有修补关守服务(代码签名),所以我需要使用我的开发者帐户并签署我正在测试的二进制文件(Absinthe补丁关守,以及它为什么你可以使用{{1}生成虚假签名)。
尝试签署结果:
ldid
我通过codesign(1)
,但我不知道如何解决它,因为它们是相同的KeyID。使用KeyID会产生相同的消息。
如何在签署可执行文件时消除歧义?
答案 0 :(得分:8)
当钥匙串中存在两个具有相同身份的证书时,会发生这种情况:
代码签名工具只需要一个。
注意:在您的问题中提及
ldid
可能需要更多 澄清它与您的Apple发布的代码签名有何关联 证书,或者到底有什么问题。
重复证书有时会出现在钥匙串中,因为一个过期的证书从未被删除过。 Apple有一些解决此类问题的指示,但如果以下方法不起作用,您可能需要在正常程序之外解决它:
最后,如果即使在创建新证书后错误仍然存在,请在Keychain Access中按住Control键并单击受影响的证书,选择" New Identity Preference"然后点击'证书'领域。如果您在此处看到重复的证书,则这是Keychain Access的一个已知且不常见的问题。要解决此问题,请尝试以下操作:
钥匙串访问>编辑>钥匙串列表,取消选中"共享"登录钥匙串。
如果回到钥匙串列表,您会发现登录钥匙串仍然标记为已共享,创建以下文件的备份,如果存在则将其删除:
/Library/Preferences/com.apple.security-common.plist
~/Library/Preferences/com.apple.security.plist
然后重试您的构建...
如果您未能通过上述步骤解决问题,请尝试搜索 对于错误消息中列出的证书之一。一旦找到 有问题的证书删除过期的证书或一个过期的证书 这与你需要的那个相冲突。
如果您有多个代码签名证书,则需要使用-s
选项指定要使用的代码(如果从命令行进行代码签名):
codesign -s <certificate name> -vvvv foo.app
-s, - 签名身份 在使用此标识给出的路径上签署代码。请参阅人工代码中的签名身份。
<强>可选强>:
-v, - 验证请求验证代码签名。如果还请求其他操作(符号,显示等),则将-v解释为 意思是--verbose。
例如,在您的情况下:
codesign -s "iPhone Developer: John Doe" cryptest.app
答案 1 :(得分:0)
如果您有多个(冲突的)证书名称,则可以创建一个新的钥匙串并将所需的证书导入其中。 “钥匙串访问”中的“钥匙串”列表是可排序的列表。因此,请确保您的新钥匙串在列表顶部。
然后将--keychain <path to new keychain file>
添加到您的codesign命令行中。
路径通常为/Users/<username>/Library/Keychains/<keychain name>.keychain-db
答案 2 :(得分:0)
解决歧义的另一种方法(至少是破解)是创建钥匙串身份首选项。
在codesign
手册页(man 1 codesign
)中:
-s, --sign identity
Sign the code at the path(s) given using this identity. See
SIGNING IDENTITIES below.
[...]
SIGNING IDENTITIES
[...]
The identity is first considered as the full name of a keychain identity
preference. If such a preference exists, it directly names the identity
used. Otherwise, the identity is located by searching all keychains for a
certificate whose subject common name (only) contains the identity string
given.
在钥匙串访问中的证书的上下文菜单中,有一个 New Identity Preference ... 项目,其中用于将该证书与之关联的URL或电子邮件地址。可以给。这是meant to allow a client certificate to be used with websites or email accounts,但是可以使用任意字符串,例如codesign-dev-id-app
。字符串直接提供给--sign
选项:
codesign --verbose --sign codesign-dev-id-app --timestamp foo.dmg
这对我有用(在macOS 10.13上),但是即使将证书和密钥放在不同的钥匙串中也没有,即使明确指定了--keychain
(codesign
仍然在所有钥匙串中都可见)。字符串应谨慎选择,以免与预期目的发生意外冲突。开发者拥有的域下的虚拟URL可能是不错的选择。