Codesign 和 Ambiguos 身份,匹配 "Mac Developer" 和 "iPhone Developer"
Codesign and Ambiguos identity, matches "Mac Developer" and "iPhone Developer"
我正在对库进行发布测试。该过程需要在 Jail Broken iOS 设备上进行测试。为此,我使用旧的 iPad 1 运行 iOS 5.1 越狱 RedSn0w.
RedSn0w 不修补 Gatekeeper 服务(代码签名),所以我需要使用我的开发者帐户并签署我正在测试的二进制文件(Absinthe 修补 Gatekeeper,这就是为什么你可以使用 ldid
生成虚假签名)。
尝试签名结果:
$ codesign -s "John Doe" cryptest.exe
John Doe: ambiguous (matches "Mac Developer: John Doe (3VT8SJ9C5)" and "iPhone Developer:
John Doe (3VT8SJ9C5)" in /Users/jdoe/Library/Keychains/login.keychain)
我通过了 codesign(1)
,但我不知道如何解决它,因为它们是相同的 KeyID。使用 KeyID 会产生相同的消息。
如何在签署可执行文件时消除歧义?
不明确的证书
当钥匙串中存在两个相同身份的证书时会发生这种情况:
协同设计工具要求只有一个。
NOTE: The mention of ldid
in your question might need a bit more
clarification as to how it relates to your Apple issued codesigning
certificates, or what the concern there is exactly.
重复的证书有时会出现在钥匙串中,这是因为一个证书已过期但从未被删除。 Apple 有一些解决此类问题的说明,但如果以下方法不起作用,您可能需要稍微超出正常程序来解决它:
- 在钥匙串访问中,确保您的 "View" 菜单 > 显示过期证书选项已打开
- 单击 "Certificates" 'Category',然后单击钥匙串访问中 'Keychain' 边栏中列出的每个钥匙串。如果您看到任何重复项,甚至是过期的证书,请删除这些重复项。
- 单击钥匙串访问中的 "Keys" 'Category'。
- 浏览每个钥匙串,查找并删除与受影响的证书具有相同通用名称的任何 "Orphaned Keys"。孤立密钥是那些未被披露三角绑定到钥匙链中当前存在的 iPhone 开发人员或 iPhone 分发证书的密钥。
- 如果您找到并删除了任何额外的密钥或证书,请重新尝试构建。
- 如果在删除所有活动或过期的相同通用名称的重复证书或密钥后问题仍然存在,您可以尝试删除 所有 个现有签名证书和密钥并用新的替换它们那些使用我如何 delete/revoke 我的证书并重新开始的步骤?
最后,如果创建新证书后错误仍然存在,请按住 Control 键并单击钥匙串访问中受影响的证书,选择 "New Identity Preference" 并单击 'Certificate' 字段。如果您看到此处列出的重复证书,这是 Keychain Access 的一个已知且不常见的问题。要解决此问题,请尝试以下操作:
Keychain Access > Edit > Keychain List,取消选中登录钥匙串的 "Shared"。
如果返回钥匙串列表,您发现登录钥匙串仍标记为共享,请创建以下文件的备份,然后将其删除(如果它们存在):
/Library/Preferences/com.apple.security-common.plist
~/Library/Preferences/com.apple.security.plist
然后重试构建...
If you fail to resolve the issue by the steps above then try searching
for one of the certificates listed in the error message. Once you find
the certifcate in question delete either the expired one, or the one
that is conflicting with the one you need.
多个协同设计证书(不重复)
如果您有多个协同签名证书,您将需要使用 -s
选项指定要使用的证书(如果从命令行进行协同签名):
codesign -s <certificate name> -vvvv foo.app
-s, --sign identity
Sign the code at the path(s) given using this identity. See SIGNING IDENTITIES in man codesign.
可选:
-v, --verify Requests verification of code signatures. If other actions (sign, display, etc.) are also requested, -v is interpreted to
mean --verbose.
例如,在您的情况下:
codesign -s "iPhone Developer: John Doe" cryptest.app
如果您有多个(冲突的)证书名称,您可以创建一个新的钥匙串并将所需的证书导入其中。 "Keychain Access" 中的 "Keychains" 列表是一个可排序的列表。因此,请确保您的新钥匙串位于列表的顶部。
然后将 --keychain <path to new keychain file>
添加到您的代码设计命令行。
路径通常是 /Users/<username>/Library/Keychains/<keychain name>.keychain-db
解决歧义的另一种方法(或至少是 hack)是创建钥匙串身份首选项。
来自 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.
在 Keychain Access 中证书的上下文菜单中,有一个项目 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 可能是一个不错的选择。
我正在对库进行发布测试。该过程需要在 Jail Broken iOS 设备上进行测试。为此,我使用旧的 iPad 1 运行 iOS 5.1 越狱 RedSn0w.
RedSn0w 不修补 Gatekeeper 服务(代码签名),所以我需要使用我的开发者帐户并签署我正在测试的二进制文件(Absinthe 修补 Gatekeeper,这就是为什么你可以使用 ldid
生成虚假签名)。
尝试签名结果:
$ codesign -s "John Doe" cryptest.exe
John Doe: ambiguous (matches "Mac Developer: John Doe (3VT8SJ9C5)" and "iPhone Developer:
John Doe (3VT8SJ9C5)" in /Users/jdoe/Library/Keychains/login.keychain)
我通过了 codesign(1)
,但我不知道如何解决它,因为它们是相同的 KeyID。使用 KeyID 会产生相同的消息。
如何在签署可执行文件时消除歧义?
不明确的证书
当钥匙串中存在两个相同身份的证书时会发生这种情况:
协同设计工具要求只有一个。
NOTE: The mention of
ldid
in your question might need a bit more clarification as to how it relates to your Apple issued codesigning certificates, or what the concern there is exactly.
重复的证书有时会出现在钥匙串中,这是因为一个证书已过期但从未被删除。 Apple 有一些解决此类问题的说明,但如果以下方法不起作用,您可能需要稍微超出正常程序来解决它:
- 在钥匙串访问中,确保您的 "View" 菜单 > 显示过期证书选项已打开
- 单击 "Certificates" 'Category',然后单击钥匙串访问中 'Keychain' 边栏中列出的每个钥匙串。如果您看到任何重复项,甚至是过期的证书,请删除这些重复项。
- 单击钥匙串访问中的 "Keys" 'Category'。
- 浏览每个钥匙串,查找并删除与受影响的证书具有相同通用名称的任何 "Orphaned Keys"。孤立密钥是那些未被披露三角绑定到钥匙链中当前存在的 iPhone 开发人员或 iPhone 分发证书的密钥。
- 如果您找到并删除了任何额外的密钥或证书,请重新尝试构建。
- 如果在删除所有活动或过期的相同通用名称的重复证书或密钥后问题仍然存在,您可以尝试删除 所有 个现有签名证书和密钥并用新的替换它们那些使用我如何 delete/revoke 我的证书并重新开始的步骤?
最后,如果创建新证书后错误仍然存在,请按住 Control 键并单击钥匙串访问中受影响的证书,选择 "New Identity Preference" 并单击 'Certificate' 字段。如果您看到此处列出的重复证书,这是 Keychain Access 的一个已知且不常见的问题。要解决此问题,请尝试以下操作:
Keychain Access > Edit > Keychain List,取消选中登录钥匙串的 "Shared"。
如果返回钥匙串列表,您发现登录钥匙串仍标记为共享,请创建以下文件的备份,然后将其删除(如果它们存在):
/Library/Preferences/com.apple.security-common.plist
~/Library/Preferences/com.apple.security.plist
然后重试构建...
If you fail to resolve the issue by the steps above then try searching for one of the certificates listed in the error message. Once you find the certifcate in question delete either the expired one, or the one that is conflicting with the one you need.
多个协同设计证书(不重复)
如果您有多个协同签名证书,您将需要使用 -s
选项指定要使用的证书(如果从命令行进行协同签名):
codesign -s <certificate name> -vvvv foo.app
-s, --sign identity Sign the code at the path(s) given using this identity. See SIGNING IDENTITIES in man codesign.
可选:
-v, --verify Requests verification of code signatures. If other actions (sign, display, etc.) are also requested, -v is interpreted to mean --verbose.
例如,在您的情况下:
codesign -s "iPhone Developer: John Doe" cryptest.app
如果您有多个(冲突的)证书名称,您可以创建一个新的钥匙串并将所需的证书导入其中。 "Keychain Access" 中的 "Keychains" 列表是一个可排序的列表。因此,请确保您的新钥匙串位于列表的顶部。
然后将 --keychain <path to new keychain file>
添加到您的代码设计命令行。
路径通常是 /Users/<username>/Library/Keychains/<keychain name>.keychain-db
解决歧义的另一种方法(或至少是 hack)是创建钥匙串身份首选项。
来自 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.
在 Keychain Access 中证书的上下文菜单中,有一个项目 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 可能是一个不错的选择。