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

Tre*_*kaz 140 macos ssh code-signing jenkins

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

我收到一个错误:

00:03:25.113 [codesign-app] build/App.app: User interaction is not allowed.
Run Code Online (Sandbox Code Playgroud)

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

  • 在签名之前立即使用安全解锁密钥链来解锁钥匙串.
  • 将签名密钥移到自己的密钥链中.
  • 将签名密钥移动到登录密钥链中.
  • 将签名密钥移动到系统密钥链中.
  • 手动将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.
Run Code Online (Sandbox Code Playgroud)

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

这里有一个类似的问题.解决方案很有趣 - 在launchctl中将"SessionCreate"设置为true.但我不是在master上构建 - 我的构建过程是从一个slave构建机器上的SSH启动的.也许有一种命令行方式可以在运行"SessionCreate"时执行launchctl正在执行的操作?

bma*_*ter 204

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

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

访问控制选项卡

  • 只是注意*除了这个*你还必须做整个'安全解锁 - 钥匙串'的东西 (24认同)
  • 此外,您可能希望将密钥从_login_移动到_system_,以便在计算机上进行远程构建时可以访问它们. (13认同)
  • 有没有人知道从命令行执行此操作的方法?出于[安全原因](https://forums.developer.apple.com/thread/25092),我的远程构建机器不允许我通过屏幕共享执行此操作. (7认同)
  • 我不得不用http://apple.stackexchange.com/a/34872/6052取消隐藏/ usr目录,以便能够将"codesign"添加到"始终允许"列表中. (3认同)
  • 别客气.您也可以考虑将代码签名添加到底部的应用程序列表,而不是像我那样允许所有应用程序.它已经存在于我的屏幕截图中,但我认为最初它不是. (2认同)
  • 可能是我有点偏执,但它应该没问题,在"始终允许这些应用程序访问"框中添加"codesign".我只是想,如果你只是需要它来代码签名,就没有必要允许它适用于所有应用程序. (2认同)

Tre*_*kaz 77

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

从本质上讲,它似乎归结为-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"
Run Code Online (Sandbox Code Playgroud)

  • 谢谢.我已经能够缩小范围了.只需在尝试构建之前运行以下命令:security -v unlock-keychain -p"$ KEYCHAIN_PASSWORD""$ HOME/Library/Keychains/login.keychain" (17认同)
  • 所以没有办法通过ssh访问`codesign`而不在某些脚本中实际存储登录密码? (3认同)
  • 在上面的例子中@chakrit,我只传递了keychain密码,而不是登录密码.我意识到,对于很多用户来说,登录密钥链是唯一的钥匙串,但在我们的例子中,我们将签名密钥保存在一个单独的密钥库中,以便更容易同步到构建机器.但是,很多这些东西对于自动化构建来说似乎相当不方便,这让我想知道Apple是否会进行自动构建. (2认同)

yon*_*nix 18

没有其他答案对我有用.

最后救了我的是这篇文章

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

修理:

security set-keychain-settings -t 3600 -l ~/Library/Keychains/login.keychain
Run Code Online (Sandbox Code Playgroud)

  • 在El Capitan上,您也可以通过用户界面完成此操作.只需打开钥匙串应用程序,右键单击您的钥匙串(登录,系统等),然后点击与"<your_keychain>"的"更改设置"匹配的内容. (2认同)

Zhe*_*lov 16

尝试调用security unlock-keychaincodesign作为一行命令.这对我有帮助.就像是:

security unlock-keychain -p <password> /Users/<user>/Library/Keychains/login.keychain && codesign --force --verify --verbose --sign "<certificate id>" <app name>
Run Code Online (Sandbox Code Playgroud)

  • 这与在两条线上做同样的事情是一样的.我猜不同的是,如果第一个命令失败,它将不会运行第二个命令. (4认同)
  • 如果您真的愿意,您也可以通过单个 ssh 会话执行多行操作。所以......它仍然是一样的,除了错误的处理。 (2认同)

Ali*_*tra 11

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


Cam*_*mer 10

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

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

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

创建钥匙串

security create-keychain -p "${KEYCHAIN_PASSWORD}" "${KEYCHAIN_NAME}"
Run Code Online (Sandbox Code Playgroud)

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

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

security list-keychains -s "${KEYCHAIN_NAME}" "${OLD_KEYCHAIN_NAMES[@]}"
Run Code Online (Sandbox Code Playgroud)

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

解锁钥匙扣

security unlock-keychain -p "${KEYCHAIN_PASSWORD}" "${KEYCHAIN_NAME}"
Run Code Online (Sandbox Code Playgroud)

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

从钥匙串中删除默认设置

security set-keychain-settings "${TESTING_KEYCHAIN}"
Run Code Online (Sandbox Code Playgroud)

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

从.p12导入您的签名证书

security import "${DIST_CER}" -P "${CERTIFICATE_PASSWORD}" -k "${KEYCHAIN_NAME}" -T /usr/bin/codesign
Run Code Online (Sandbox Code Playgroud)

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

在钥匙串上设置ACL

security set-key-partition-list -S apple-tool:,apple: -s -k "${KEYCHAIN_PASSWORD}" "${KEYCHAIN_NAME}"
Run Code Online (Sandbox Code Playgroud)

这是许多人错过的要求。您可以使用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
Run Code Online (Sandbox Code Playgroud)

共同设计框架,dylib等。

/usr/bin/codesign --verbose=4 -f -s "$SIGNER_HASH" "$SIGNABLE"
Run Code Online (Sandbox Code Playgroud)

共同设计应用程序捆绑

/usr/bin/codesign --verbose=4 -f -s "$SIGNER_HASH" --entitlements entitlements.xcent "$SIGNABLE"
Run Code Online (Sandbox Code Playgroud)

最后说明-如果您查看Xcode的工作方式,则将其设置CODESIGN_ALLOCATE为使用Xcode而不是Xcode中包含的代码/usr/bin

export CODESIGN_ALLOCATE="$( xcrun --find codesign_allocate )"
Run Code Online (Sandbox Code Playgroud)

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

  • 老兄,您可以肯定地写一篇有关它的文章,我已经找了两天了。我不知道我读了多少东西和stackoverflow帖子。非常感谢你! (3认同)

Mer*_*Ran 5

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

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