Codeign和Ambiguos身份,匹配“Mac Developer”和“iPhone Developer”

时间:2015-10-03 18:12:19

标签: ios code-signing jailbreak

我正在测试库的发布过程。该过程需要在Jail Broken iOS设备上进行测试。为此,我使用旧的iPad 1运行iOS 5.1监狱,并使用RedSn0w

RedSn0w没有修补关守服务(代码签名),所以我需要使用我的开发者帐户并签署我正在测试的二进制文件(Absinthe补丁关守,以及它为什么你可以使用{{1}生成虚假签名)。

尝试签署结果:

ldid

我通过codesign(1),但我不知道如何解决它,因为它们是相同的KeyID。使用KeyID会产生相同的消息。

如何在签署可执行文件时消除歧义?

3 个答案:

答案 0 :(得分:8)

不明确的证书

当钥匙串中存在两个具有相同身份的证书时,会发生这种情况:

代码签名工具只需要一个。

  

注意:在您的问题中提及ldid可能需要更多   澄清它与您的Apple发布的代码签名有何关联   证书,或者到底有什么问题。

重复证书有时会出现在钥匙串中,因为一个过期的证书从未被删除过。 Apple有一些解决此类问题的指示,但如果以下方法不起作用,您可能需要在正常程序之外解决它:

  1. 在Keychain Access中,确保您的"查看"菜单> “显示过期的证书”选项已打开
  2. 点击"证书" '分类'然后点击您在“钥匙串”中列出的每一个钥匙串。 Keychain Access中的侧栏。如果您看到任何重复项,甚至是过期的证书,请删除这些重复项。
  3. 点击"键" '分类'在钥匙串访问。
  4. 浏览每个钥匙串,查找并删除任何"孤立密钥"与受影响的证书具有相同的公用名。孤立密钥是不受Disclosure Triangle绑定到目前存在于钥匙串中的iPhone Developer或iPhone Distribution证书的密钥。
  5. 如果您找到并删除了任何额外的密钥或证书,请重新尝试构建。
  6. 如果在使用相同的公用名删除所有活动或过期的重复证书或密钥后问题仍然存在,您可以尝试删除所有现有签名证书和密钥,并使用以下步骤将其替换为新证书和密钥。如何删除/撤销我的证书并重新开始?
  7. 最后,如果即使在创建新证书后错误仍然存​​在,请在Keychain Access中按住Control键并单击受影响的证书,选择" New Identity Preference"然后点击'证书'领域。如果您在此处看到重复的证书,则这是Keychain Access的一个已知且不常见的问题。要解决此问题,请尝试以下操作:

    钥匙串访问>编辑>钥匙串列表,取消选中"共享"登录钥匙串。

  8. 如果回到钥匙串列表,您会发现登录钥匙串仍然标记为已共享,创建以下文件的备份,如果存在则将其删除:

        /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上),但是即使将证书和密钥放在不同的钥匙串中也没有,即使明确指定了--keychaincodesign仍然在所有钥匙串中都可见)。字符串应谨慎选择,以免与预期目的发生意外冲突。开发者拥有的域下的虚拟URL可能是不错的选择。