尝试使用协同设计签署OSX应用程序时“不允许用户交互”

时间:2013-11-25 22:54:49

标签: macos ssh jenkins code-signing

我们的自动构建在Jenkins上运行。构建本身在从属服务器上运行,从服务器通过SSH执行。

我收到错误:

00:03:25.113 [codesign-app] build/App.app: User interaction is not allowed.

我已经尝试了迄今为止我在其他帖子中看到的所有建议:

  • 在签名之前立即使用安全解锁密钥链来解锁钥匙串。
  • 将签名密钥移到自己的钥匙串中。
  • 将签名密钥移动到登录密钥链中。
  • 将签名密钥移动到系统密钥链中。
  • 将list-keychains手动设置为仅包含密钥的keychain。

在所有情况下,我都会遇到同样的错误。

为了诊断问题,我尝试在我的本地终端上运行“security unlock-keychain”命令,发现它实际上没有解锁钥匙串 - 如果我查看Keychain Access,锁定符号仍然是那里。无论我是在命令行上传递密码还是让它提示我,都是这种情况。使用GUI解锁相同的钥匙串将提示我输入密码然后解锁。此外,如果我运行“安全锁 - 钥匙串”,我执行运行命令后立即看到键锁。这让我觉得解锁钥匙串实际上并不起作用。我在Lion(我们用于构建奴隶)和Mavericks(我正在开发它)上遇到相同的行为。

接下来,我尝试将-v添加到所有安全命令中:

list-keychains "-d" "system" "-s" "/Users/tester/.secret/App.keychain"
Listing keychains to see if it was added: ((
        "/Library/Keychains/System.keychain"
))
unlock-keychain "-p" "**PASSWORD**" "/Users/tester/.secret/App.keychain"
build/App.app: User interaction is not allowed.

从这看起来,列表 - 钥匙链似乎是不起作用的。也许都不行。 :/

有一个similar question here。解决方案很有趣 - 在launchctl中将“SessionCreate”设置为true。但我不是在master上构建 - 我的构建过程是从一个slave构建机器上的SSH启动的。也许有一种命令行方式可以在运行“SessionCreate”时执行launchctl正在做的事情?

17 个答案:

答案 0 :(得分:201)

我也一直在打这个。在http://devnet.jetbrains.com/thread/311971上尝试这个建议之前没有任何帮助。谢谢ashish agrawal!

通过GUI登录您的构建用户并打开Keychain Access。选择您的签名私钥,右键单击,选择获取信息,切换到访问控制选项卡,然后选择"允许所有应用程序访问此项目"。

access control tab

答案 1 :(得分:76)

嗯,我想我今天可以回答我自己的问题了,因为在刺了两天半之后,我尝试过的其中一件事似乎有效。我现在就要退出它,并希望它继续工作。

基本上,它似乎归结为-d system实际上没有工作。因此,围绕这里的其他问题的许多答案应该更新以反映这一点。

security -v list-keychains -s "$KEYCHAIN" "$HOME/Library/Keychains/login.keychain"
security list-keychains # so we can verify that it was added if it fails again
security -v unlock-keychain -p "$KEYCHAIN_PASSWORD" "$KEYCHAIN"
codesign --sign "$SIGNER_IDENTITY" --force --signature-size 9600 \
         --resource-rules src/AppResourceRules.plist --timestamp --verbose \
         "$APP"

答案 2 :(得分:18)

其他答案都不适用于我。

最终救了我的是this post

总结一下,这可能是由于默认超时时间为5分钟,这会在长时间构建后触发此错误。

修复:

security set-keychain-settings -t 3600 -l ~/Library/Keychains/login.keychain

答案 3 :(得分:16)

尝试将security unlock-keychaincodesign作为一行命令调用。这对我有帮助。类似的东西:

security unlock-keychain -p <password> /Users/<user>/Library/Keychains/login.keychain && codesign --force --verify --verbose --sign "<certificate id>" <app name>

答案 4 :(得分:11)

将钥匙放入系统钥匙串

答案 5 :(得分:7)

使用安全性为/ usr / bin / codesign创建钥匙串

导入证书并以编程方式使其与Codesign结合使用,无需使用登录或系统钥匙串,也无需向CodeSign的某些上帝祈祷。您只需要设置正确的权限即可。我建议创建一个专门用于代码签名的新钥匙串。

这些天来使codesign不能产生errSecInternalComponent时,您需要正确获取分区列表(ACL)。我将逐步执行以下步骤:

创建钥匙串

security create-keychain -p "${KEYCHAIN_PASSWORD}" "${KEYCHAIN_NAME}"

这时,钥匙串已解锁,但不会出现在Keychain Access中。

将新的钥匙串添加到搜索列表中

security list-keychains -s "${KEYCHAIN_NAME}" "${OLD_KEYCHAIN_NAMES[@]}"

将新的钥匙串添加到列表中。如果您不首先从list-keychains中获取原始列表,则搜索列表中将不再包含login.keychain

解锁钥匙链

security unlock-keychain -p "${KEYCHAIN_PASSWORD}" "${KEYCHAIN_NAME}"

如果您在上面创建了钥匙串,那么这是多余的,但是如果钥匙串已经存在,则有必要。

从钥匙串中删除默认值

security set-keychain-settings "${TESTING_KEYCHAIN}"

通过不指定任何参数,这会将自动锁定超时设置为无限制,并删除睡眠时的自动锁定。

从.p12导入您的签名证书

security import "${DIST_CER}" -P "${CERTIFICATE_PASSWORD}" -k "${KEYCHAIN_NAME}" -T /usr/bin/codesign

导入证书,并通过codesign选项授予-T访问权限。

在钥匙串上设置ACL

security set-key-partition-list -S apple-tool:,apple: -s -k "${KEYCHAIN_PASSWORD}" "${KEYCHAIN_NAME}"

这是许多人错过的要求。您可以使用dump-keychain查看macOS的功能。在进行代码签名的情况下,需要apple:apple-tool:-s是指签署证书。

Gitlab-Runner,詹金斯(Jenkins)等

对于任何CI型运行器或构建系统来说,一件非常重要的事情是确保正确地从launchd开始该过程。确保您的plist包含<SessionCreate> </true>

将钥匙串的所有者与构建过程不正确匹配,并确保创建安全会话将导致各种麻烦。从诊断角度来说,您可以引入list-keychains,然后查看输出是否符合您的期望。

这来自launchd.plist手册页:

SessionCreate <boolean>

  

此密钥指定应将作业生成为新的安全性   审核会话,而不是上下文的默认会话属于   至。有关详细信息,请参见auditon(2)。

UserName <string>

  

此可选键指定用户以其身份运行作业。该密钥仅   适用于加载到特权系统中的服务   域。

GroupName <string>

  

此可选键指定运行作业的组。该密钥仅   适用于加载到特权系统中的服务   域。如果设置了UserName而没有设置GroupName,则该组将是   设置为用户的主要组。

最后的代码签名

您可以使用find-identity

查找签名证书哈希
security find-identity -p codesigning -v

共同设计框架,dylib等。

/usr/bin/codesign --verbose=4 -f -s "$SIGNER_HASH" "$SIGNABLE"

共同设计应用程序包

/usr/bin/codesign --verbose=4 -f -s "$SIGNER_HASH" --entitlements entitlements.xcent "$SIGNABLE"

最后的注释-如果您查看Xcode的工作方式,则会将CODESIGN_ALLOCATE设置为使用Xcode中包含的内容,而不使用/usr/bin中包含的内容。

export CODESIGN_ALLOCATE="$( xcrun --find codesign_allocate )"

搜索路径设置为${PLATFORM_PATH}:${TOOLCHAIN_PATH}:${PATH},其中PLATFORM路径是给定目标SDK的/ usr / bin目录,而TOOLCHAIN_PATH是Xcode宿主工具的/ usr / bin。

答案 6 :(得分:5)

所以这是有效的命令。 -A是为了防止Mac问密码。导入system.keychain并不需要GUI。

sudo security import <cert.p12> -k "/Library/Keychains/System.keychain" -P <passphrase> -A

答案 7 :(得分:3)

我的钥匙串被锁定了。 抵制我改变这一事实的进展......

Keychain Access - &gt; Keychain First Aid - &gt; Repairetvoilá

答案 8 :(得分:2)

解锁钥匙串是不够的。您还必须将私钥访问权限设置为“允许所有应用访问此项目”。要从命令行执行此操作,需要重新导入密钥。所以一次拿东西:

如果锁定了登录钥匙串,请将其解锁。它不应该被锁定,但无论如何这里是你如何做到的:

security -v unlock-keychain -p "$KEYCHAIN_PASSWORD" "~/Library/Keychains/login.keychain"

如果由于某种原因您的构建计算机锁定了登录密钥链,并且您不希望在脚本中公开该密码,那么您应该使用不同的钥匙串。您可以在现场创建一个,并在上一个和下一个命令中使用它。要在现场创建一个:

security create-keychain -p 'temporaryPassword' MyKeychain.keychain
security list-keychains -d user -s login.keychain MyKeychain.keychain

然后使用-A参数将证书和关联的私钥导入登录密钥链。请注意,您不需要为所有这些sudo ...

security import <cert.p12> -k "~/Library/Keychains/login.keychain" -P <passphrase> -A

-A参数可以将您的私钥设置为“允许所有应用访问此项目”

因此,使用所有这些,您应该能够创建一个脚本,安装所需的证书来构建版本ipa并在没有提示的情况下对其进行签名。您可以将.p12文件存储在您的仓库中,这样任何机器都可以构建您的ipa而无需手动设置。

答案 9 :(得分:1)

除了解锁钥匙串(如另一个答案中所述)之外,您还需要允许所有应用程序访问钥匙串中的Xcode身份验证令牌:

  • 选择“登录”钥匙串
  • 选择“所有项目”类别
  • 搜索“ xcode”关键字
  • 为所有Xcode令牌选择“允许所有应用程序访问此项目”
  • 别忘了添加解锁钥匙串步骤(来自先前的答案)

Screenshot

答案 10 :(得分:1)

所以我在这里尝试了每一个答案,但事情并没有完全加起来。最后我发现当我重新启动我的CI服务时,它运行的用户不同于我预期的用户。更改为实际有权访问其登录链中的密钥的用户修复了所有内容。这可能不是一个常见的问题,但是想要记录这个错误的具体原因,以防其他人遇到这种情况。

答案 11 :(得分:1)

将您的密钥导入系统密钥链。您可以使用此命令:

sudo security import YourKey.p12 -k /Library/Keychains/System.keychain -P PasswordToYourKey -T /usr/bin/codesign

答案 12 :(得分:0)

我查看了所有这些建议,但在Jenkins的工作中使用fastlane的gym仍然遇到问题。我已经安装了证书并且钥匙串已解锁,并且当我在命令行上手动运行codesign命令时能够对从机进行编码。

作为一种解决方法,如果Jenkins使用JNLP而不是SSH连接到从属设备,您将能够进行协同设计。

答案 13 :(得分:0)

在我的情况下,这是由创建的钥匙串引起的,默认超时为300秒,长xcode编译持续时间超过300秒。对我来说,解决方法是调用:

security set-keychain-settings -t <longer timeout in seconds> <keychain>

创建临时钥匙串后立即

答案 14 :(得分:0)

对我来说,当手动添加第二个钥匙串并锁定它时,就会发生这种情况。由于某种原因,codesign尝试访问锁定的钥匙串并且即使证书位于登录钥匙串中(并且已解锁)也会失败。解锁第二个解决了问题。对我来说没有意义。

答案 15 :(得分:0)

对我来说,没有任何工作似乎必须重新安装Xcode。詹金斯不断给出同样的错误。 如果您只是将Xcode安装移至废纸篓并重新安装,则可以节省大量时间。确保至少从命令行运行codesign命令一次。

即使您遇到同样的错误,也请尝试设置“解锁钥匙串”?&#39; Jenkins内的属性,并在/ Users / $ {USER} /Library/Keychains/login.keychain

下提供login.keychain的路径

我希望上帝在你之后和你在一起。

答案 16 :(得分:-1)

尝试了以上几种解决方案后。我意识到我有一个因素,就是我正在使用ION控制台启动构建。当我切换回使用终端应用程序进行构建时,一切正常。