20

我的公司使用一台构建机器(Mac Mini)作为 CI 节点来构建我们的 iOS 应用程序。我们目前在 mini 上构建了 Ad-Hoc 和 App Store 配置。我们最近加入了企业计划,并希望开始构建企业配置。但是,我们的构建过程现在失败了,因为我们现在有两个名为“iPhone Distribution: Widget Corporation”的证书。一个是 AdHoc/AppStore 的分发证书,一个是 Enterprise(Apple 称之为 In-House)的分发证书。

我尝试修改 mini 的钥匙串,使一个证书在登录钥匙串中,一个在名为“企业”的新钥匙串中,但这只是从构建开始时转移了错误:

CodeSign error: Certificate identity 'iPhone Distribution: Widget Corporation' appears more than once in the keychain.

到构建结束:

iPhone Distribution: Widget Corporation: ambiguous (matches "iPhone Distribution: Widget Corporation" in /Users/hudson.admin/Library/Keychains/login.keychain and "iPhone Distribution: Widget Corporation" in /Users/hudson.admin/Library/Keychains/enterprise.keychain)

我的问题是,是否有办法正确地将这两个证书沙箱化,以便我可以在同一台机器上构建应用程序的 Ad-Hoc、App Store 和内部版本。我还没有尝试过的唯一可能的解决方案是将证书与源代码捆绑在一起,并根据security需要添加和删除证书;显然,该解决方案不是很漂亮并且会带来安全风险。

有任何想法吗?

4

5 回答 5

17

在与 Apple 开发人员技术支持讨论后,他们建议创建单独的钥匙串来存放不同的证书,然后将--keychain filename参数传递到codesign步骤中以指向适当的文件。OTHER_CODE_SIGN_FLAGS您可以使用该选项将此参数传递给 Xcode 或 xcodebuild 。例如:

xcodebuild -target "<targetname>" -configuration "<configname>" \
  PROVISIONING_PROFILE=A3A47A82-E91F-4E95-8559-601C6C857053 \
  OTHER_CODE_SIGN_FLAGS="--keychain=/Users/username/Library/Keychains/enterprise.keychain" \
  build  

此外,在创建新钥匙串后,它似乎默认在 5 分钟后重新锁定 - 如果您的构建需要一段时间,您可能需要更改此设置。

于 2011-06-01T15:21:44.913 回答
9

另一种帮助我的方法是将签名身份作为 SHA1 散列提供给共同签名。脚步:

  1. 在所需证书的钥匙串访问中查找 SHA1 哈希
  2. 将 SHA1 哈希与以下返回的哈希进行比较:security find-identity -v -p codesigning
  3. 使用第 2 步中的正确 SHA1 进行协同设计:codesign -s "SHA1_FROM_STEP2" ...
于 2013-03-12T22:24:58.957 回答
5

在与 WWDC 的 xcode 团队交谈后,他们提出了一个更简单的解决方案——我可以要求重命名我的企业证书,以免发生冲突。

为此,请通过单击开发人员联系页面上的“管理您的帐户”链接然后选择“iOS 配置门户”作为主题来联系开发人员服务 - 他们在我询问的一天内为我完成了此操作。

这比任何其他方式都简单得多 - 我现在在我的钥匙串中拥有两组证书,并且可以愉快地为应用商店或企业分发构建,而无需做任何其他事情,只需选择正确的实体进行协同设计。

于 2012-07-06T16:30:02.237 回答
0

我在这方面遇到了很多麻烦。可能最好的解决方案是只要求 Apple 重命名您的证书,但如果您不想处理,我使用了不同的解决方案。我有一个文件夹,我在其中导出了常规证书和企业证书。然后您可以删除您不使用的证书并导入另一个证书。也许这比较麻烦,但通常我只在企业中分发应用程序,所以没有那么麻烦。

顺便说一句,我删除证书的方法是选择证书过滤器,然后显示关联的私钥,然后我删除证书和密钥。如果我只删除证书 Xcode 会继续创建它。

于 2013-05-29T09:31:55.780 回答
0

详细说明 homer_simpson 的答案:可以直接计算 .p12 文件的 SHA1(不使用security调用),然后将结果提供给codesignor xcrun。这是我的自动构建脚本的摘录:

# get SHA1 of .p12 file and pass it to PackageApplication to prevent ambiguity in cert selection
# sample output of openssl: SHA1 Fingerprint=14:B0:58:D1:F9:1D:A5:74:0A:AA:BE:B9:F2:7A:7E:AD:58:82:A2:25
# fingerprint (everything after =) is extracted with cut, and : are removed with sed

# ${IDENTITY} is a variable that contains path to your .p12 file. passphrase is empty in this case.
P12_SHA=$(openssl pkcs12 -in "${IDENTITY}" -nodes -passin pass: | openssl x509 -noout -fingerprint -sha1 | cut -d = -f 2 | sed -e 's/://g')

/usr/bin/xcrun -sdk iphoneos PackageApplication -s "${P12_SHA}" ...
于 2014-08-25T17:44:32.017 回答