【问题标题】:CodeSign collisions between Developer and Enterprise Distribution开发人员和企业分发之间的 CodeSign 冲突
【发布时间】:2011-07-06 17:56:52
【问题描述】:

我的公司使用一台构建机器(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 和 In-House 版本。我尚未尝试的唯一可能的解决方案是将证书与源代码捆绑在一起,并使用security 根据需要添加和删除证书;显然,该解决方案不是很漂亮,并且会带来安全风险。

有什么想法吗?

【问题讨论】:

  • 我已将这个问题作为 TSI 提交给 Apple。如果我得到一个,我会更新他们的答案。

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


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

      另一种帮助我的方法是将签名身份作为 SHA1 哈希值提供给共同签名。 步骤:

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

      【讨论】:

      • 只是为了确认,我尝试在 xcrun 中使用哈希码,并防止任何模棱两可的命名冲突!
      • 为了澄清@XGouchet 的响应,您可以使用证书的SHA1 指纹作为xcrun 中--sign 参数的值,如下所示:xcrun -sdk iphoneos PackageApplication -sign <40 character SHA1 fingerprint here>...。就我而言,这使我可以毫无歧义地使用我的开发人员和企业证书,调用 Apple、重命名或创建新的钥匙串
      【解决方案4】:

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

      为此,请点击developer contact page 上的“管理您的帐户”链接,然后选择“iOS 配置门户”作为主题,联系开发者服务 - 他们在我询问的一天内就为我完成了此操作。

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

      【讨论】:

      • 天哪,这太棒了。我只是要求他们为我们的企业帐户做同样的事情。
      • 我也提出了这个要求,但被告知这是不行的。我也无法获得上述解决方案来工作(尽管我没有花很多时间),并且一直在删除我在构建时没有使用的证书。这不是最棒的。
      • 是的,我尝试为另一位客户提出此请求,但也遇到了困难。不清楚为什么我第一次尝试时它如此容易......
      • 花了 3 个月的时间让 Apple 在我们的 iOS 开发者企业计划中更改组织名称,但这完全值得。我通过设置单独的钥匙串和詹金斯节点(每个使用单独的 OS X 用户)来解决这个问题。在生成获取新组织名称的新证书后,我终于可以说不再需要节点/用户/钥匙串分区了。此外,@kevboh 提供的 OTHER_CODE_SIGN_FLAGS="--keychain=..." 解决方案并非在所有情况下都有效。如果没有记错,Xcode Organizer 归档/退出操作不会使用该设置。
      【解决方案5】:

      在与 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 分钟后重新锁定 - 如果您的构建需要一段时间,您可能需要更改此设置。

      【讨论】:

      • 谢谢kevboh,这对我很有效!我在您的答案中添加了一个示例命令行,以防它对其他人有用。我现在实际上将钥匙串文件放入了我的 RCS,因此可以直接从源代码树中使用它。
      • 仅供参考,这可以在 Xcode 4 中的 Project navigator > project > target > Build Settings > Code Signing section > Other Code Signing Flags 下进行配置.输入整个值,如:--keychain=/Users/username/Library/Keychains/enterprise.keychain
      • 我真的很难让这种方法与 xcode 4.3.2 一起使用(它在 4.2 中运行良好) - 代码设计失败并显示“未找到身份”
      • @kevboh 在构建之前,我已经能够通过执行以下操作使其与 xcode 4.3.2 一起使用:security list-keychain -s ./enterprise.keychain - 虽然它并不完全理想!
      • 这仍然适用于我使用 Xcode UI 并在其他代码签名标志设置中设置 --keychain,我没有将它与 xcodebuild 一起使用,所以 ymmv 在那里。我只是在配置中设置,然后将配置传递给xcodebuild。
      猜你喜欢
      • 2013-10-28
      • 2018-05-17
      • 2015-09-03
      • 2017-08-04
      • 2011-02-02
      • 1970-01-01
      • 1970-01-01
      • 2016-07-24
      • 1970-01-01
      相关资源
      最近更新 更多