开发人员和企业分发之间的CodeSign冲突

时间:2011-03-01 18:51:29

标签: objective-c ios continuous-integration hudson codesign

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

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

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根据需要添加和删除证书;显然,解决方案不是很漂亮,并带来安全风险。

有什么想法吗?

5 个答案:

答案 0 :(得分: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分钟后重新锁定 - 如果你的构建需要一段时间,你可能想要更改它。

答案 1 :(得分:9)

另一种帮助我的方法是将签名身份作为SHA1哈希给予协同签名。 步骤进行:

  1. 在所需证书的钥匙串访问中查找SHA1哈希值
  2. 将SHA1哈希与由security find-identity -v -p codesigning
  3. 返回的哈希值进行比较
  4. 使用步骤2中的正确SHA1进行代码签名:codesign -s "SHA1_FROM_STEP2" ...

答案 2 :(得分:5)

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

要执行此操作,请单击developer contact page上的“管理您的帐户”链接,然后选择“iOS Provisioning Portal”作为主题,与开发者服务部门联系 - 他们在我询问的一天内为我做了这个。 / p>

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

答案 3 :(得分:0)

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

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

答案 4 :(得分:0)

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

# 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}" ...