开发者与企业分布之间的CodeSign冲突

我的公司使用一个构build机器(Mac Mini)作为CI节点来构build我们的iOS应用程序。 我们目前在mini上构build一个Ad-Hoc和一个App Storeconfiguration。 我们最近注册了企业程序,并且也想开始构build企业configuration。 然而,我们的构build过程现在失败了,因为我们现在有两个证书,名为“iPhone Distribution:Widget Corporation”。 一个是AdHoc / AppStore的分发证书,一个是企业版(苹果称之为内部)。

我已经尝试修改迷你钥匙串,使得一个证书在login钥匙串中,一个在新的钥匙串中被称为“企业”,但是这只是将错误从开始构build:

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

到构build结束:

 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) 

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

有任何想法吗?

在与Apple Developer Technical Support讨论之后,他们build议创build单独的钥匙串以容纳不同的证书,然后将--keychain filenameparameter passing到--keychain filename步骤,以指向相应的文件。 您可以使用OTHER_CODE_SIGN_FLAGS选项将此parameter passing到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 

另外,创build一个新的钥匙串后,5分钟后似乎默认重新locking – 如果您需要一段时间的构build,则可能需要更改此设置。

另一种帮助我的方法是将签名标识作为SHA1哈希值进行编码。 脚步:

  1. 在所需证书的钥匙串访问中findSHA1哈希
  2. 比较SHA1哈希和security find-identity -v -p codesigning返回的哈希
  3. 使用步骤2中正确的SHA1进行codesign -s "SHA1_FROM_STEP2" ...codesign -s "SHA1_FROM_STEP2" ...

在与WWDC的xcode团队交谈之后,他们提出了一个更简单的解决scheme – 我可以要求我的企业证书被重命名,所以没有冲突。

要做到这一点,请点击开发者联系页面上的“pipe理您的帐户”链接,然后select“iOS Provisioning Portal”作为主题,联系开发者服务 – 他们在我问了一天之内为我做了这个。

这比任何其他方式都要简单得多 – 我现在在我的钥匙串中都有两套证书,并且可以高兴地为appstore或企业分发构build,而不用做任何事情,而不是select合适的实体进行编码。

我遇到了很多麻烦。 可能最好的解决办法就是要求苹果公司重新命名你的证书,但如果你不想处理这个问题,我使用了不同的解决scheme。 我有一个文件夹,我导出了常规和企业证书。 然后你可以删除你没有使用的证书,并导入另一个。 也许这更麻烦,但通常我只在企业中分发应用程序,所以没有那么多麻烦。

顺便说一下,我所做的删除证书是select证书filter,然后显示相关的私钥,然后删除证书和密钥。 如果我只删除证书Xcode不断创build它。

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

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