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

问题描述 投票:135回答:16

我们的自动构建在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解锁相同的钥匙串将提示我输入密码然后解锁。另外,如果我运行“security lock-keychain”,我会在运行命令后立即看到密钥锁。这让我觉得解锁钥匙串实际上并不起作用。我在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正在执行的操作?

macos ssh jenkins code-signing
16个回答
201
投票

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

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


1
投票

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

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

1
投票

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


0
投票

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

即使你得到相同的错误,尝试设置'解锁钥匙串?' Jenkins内的属性,并在/Users/${USER}/Library/Keychains/login.keychain下给出login.keychain的路径

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


0
投票

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

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

创建临时钥匙串后立即创建。


0
投票

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

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


0
投票

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


-1
投票

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


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"

18
投票

没有其他答案对我有用。

最终救了我的是this post

总而言之,这可能是由默认超时5分钟引起的,这将在长时间构建后触发此错误。

修理:

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

16
投票

尝试将security unlock-keychaincodesign称为单行命令。这对我有帮助。就像是:

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

11
投票

将您的密钥放入系统钥匙串


7
投票

Using Security to create a Keychain for /usr/bin/codesign

导入证书并使其以编程方式使用代码签名不是使用登录或系统密钥链或向某些代码之神祈祷的问题。您只需要设置正确的权限即可。我建议专门为代码签名创建一个新的钥匙串。

这些天让codesign不产生errSecInternalComponent你需要让分区列表(ACL)正确。我将逐步完成这些步骤:

Create the Keychain

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

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

Add the new Keychain to the search list

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

将新的钥匙串添加到列表中。如果你没有先从list-keychains中取出原始列表,你的搜索列表中将不再有login.keychain

Unlock the keychain

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

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

Remove the defaults from the Keychain

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

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

Import your signing certs from a .p12

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

导入证书并通过codesign选项提供-T访问权限。

Set the ACL on the keychain

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 and the like

任何CI类型的跑步者或构建系统的一个非常重要的事情是确保正确地从launchd开始该过程。确保你的plist包含<SessionCreate> </true>

未正确匹配钥匙串的所有者与构建过程并确保创建安全会话将导致各种令人头疼的问题。在诊断方面,您可以介绍list-keychains并查看输出是否符合您的期望。

这是来自launchd.plist手册页:

SessionCreate <boolean>

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

UserName <string>

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

GroupName <string>

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

Finally codesign

您可以使用find-identity查找签名证书哈希

security find-identity -p codesigning -v

Codesign a framework, dylib, etc.

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

Codesign the app bundle

/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。


5
投票

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

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


3
投票

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

Keychain Access - > Keychain First Aid - > Repair,etvoilá!


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文件存储在repo中,这样任何一台机器都可以构建您的ipa而无需手动设置。

© www.soinside.com 2019 - 2024. All rights reserved.