尝试使用codesign签署OSX应用程序时出现“不允许用户交互”的错误。

161
我们的自动化构建正在Jenkins上运行。构建本身是在从属机器上运行的,这些从属机器通过SSH执行。
我遇到了一个错误:
00:03:25.113 [codesign-app] build/App.app: User interaction is not allowed.

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

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

无论哪种情况,我都收到相同的错误。

为了诊断问题,我尝试在本地终端上运行"security unlock-keychain"命令,并发现它实际上并没有解锁钥匙串——如果我在Keychain Access中查看,锁图标仍然存在。无论我是在命令行上传递密码还是让它提示我输入密码,情况都是如此。使用GUI解锁同一钥匙串将提示我输入密码,然后解锁它。另外,如果我运行"security lock-keychain",我会在运行命令后立即看到密钥被锁定。这让我觉得unlock-keychain实际上不起作用。我在Lion(我们用于构建从机)和Mavericks(我正在开发的版本)上遇到了相同的问题。

接下来,我尝试在所有security命令中添加-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.

由此看来,似乎list-keychains出了问题。也许两者都没有工作。 :/

这里有一个类似的问题。 解决方案很有意思——在launchctl中将"SessionCreate"设置为true。但我不是在主机上构建——我的构建过程是从SSH连接到一个从机器上启动的。也许有一种命令行的方法可以完成运行"SessionCreate"时launchctl所做的事情?


如何在CircleCI上设置钥匙串密码? - Sachin Kumaram
@SachinKumaram听起来像是一个可行的新问题? - Hakanai
17个回答

0
所以我尝试了这里的每一个答案,但有些地方还不太对。最后我发现,当我重新启动CI服务时,它是在一个与我预期不同的用户下运行的。更改为实际具有访问其登录链中密钥权限的用户即可解决问题。这可能不是一个常见的问题,但我想记录下我出现此错误的具体原因,以防其他人也遇到类似情况。

我也遇到了完全相同的问题。谢谢你的回答。 :) - Paweł K

0

将您的密钥导入系统钥匙串。您可以使用以下命令:

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

-1

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


它将尝试匹配签名密钥哈希的第一个钥匙串。因此,将其放在一个钥匙串中并解锁该钥匙串非常重要。 - Cameron Lowell Palmer

-1

对我来说,什么都没有起作用,似乎必须重新安装Xcode。Jenkins一直给出相同的错误。

如果你只是把Xcode安装文件移到废纸篓并重新安装的话,你会省下很多时间。确保你至少从命令行运行过codesign命令。

即使在那之后仍然出现相同的错误,也请尝试在Jenkins内设置“解锁钥匙串?”属性,并在/Users/${USER}/Library/Keychains/login.keychain下指定你的login.keychain路径。

祝你好运。


-1
在我的情况下,这是由于使用默认超时时间为300秒创建了一个钥匙串,并且长时间的Xcode编译持续时间超过了300秒。对我来说,解决方法是在创建临时钥匙串后立即调用以下命令:
security set-keychain-settings -t <更长的超时时间(以秒为单位)> <keychain>
谢谢!

-1

我尝试了所有这些建议,但在 Jenkins 作业中使用 fastlane 的 gym 仍然存在问题。我已经安装了证书并解锁了钥匙串,在手动运行命令行上的 codesign 命令时,能够在从机上进行代码签名。

作为一种解决方法,如果 Jenkins 使用 JNLP 而不是 SSH 连接到从机,则可以进行代码签名。


-2

在尝试了上述解决方案之后,我意识到一个问题就是我一开始使用的是 ION 控制台来构建。当我切换回使用终端应用程序进行构建时,一切都正常工作了。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接