试图用codesign签名OSX应用程序的“用户交互不被允许”

我们的自动化构build在Jenkins上运行。 这个版本本身是在奴隶上运行的,奴隶是通过SSH来执行的。

我得到一个错误:

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

我已经尝试过我在其他post中看到的所有build议:

  • 在签名之前立即使用安全解锁钥匙串来解锁钥匙串。
  • 将签名密钥移出到自己的钥匙串中。
  • 将签名密钥移入login钥匙串。
  • 将签名密钥移入系统钥匙串。
  • 手动设置列表钥匙链仅包含密钥的钥匙串。

在任何情况下,我都会得到同样的错误。

在尝试诊断问题时,我尝试在本地terminal上运行“security unlock-keychain”命令,发现它实际上并未解锁钥匙串 – 如果我查看Keychain Access,锁符号仍然存在。 无论我在命令行传递密码还是让它提示我,都是这种情况。 使用GUI解锁相同的钥匙串将提示我input密码,然后解锁。 另外,如果我运行“security lock-keychain”,运行命令后我立即看到按键locking。 这让我觉得解锁钥匙串实际上并不工作。 我在Lion(我们用来构build奴隶)和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. 

由此看来,列表钥匙链是不起作用的。 也许不工作。 :/

这里也有类似的问题 。 解决scheme很有趣 – 在launchctl中将“SessionCreate”设置为true。 但是我没有build立在master上 – 我的构build过程是从一个从站生成机器上的SSH开始的。 也许有一个命令行的方式来做什么,当你运行“SessionCreate”launchctl正在做什么?

我也一直在打架。 没有什么帮助,直到我尝试了http://devnet.jetbrains.com/thread/311971的build议。; 感谢ashish agrawal!

通过GUIlogin您的构build用户并打开“钥匙串访问”。 select您的签名私钥,右键单击,select获取信息,切换到访问控制选项卡,并select“允许所有应用程序访问此项目”。

访问控制选项卡

那么,我想我今天回答自己的问题,因为经过两天半的时间,我尝试了一件似乎已经奏效的事情。 我现在只想退出,希望它继续工作。

实质上,它看起来像是-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" 

没有其他答案为我工作。

最终救了我的是这个职位

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

修理:

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

尝试调用security unlock-keychaincodesign作为单行命令。 这帮助了我。 就像是:

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

把你的钥匙放在系统钥匙串里

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

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

我的钥匙链被locking。 它抵制我的进步改变这个事实…

Keychain Access – > Keychain First Aid – > Repair等等

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

解锁login钥匙链,如果它被locking。 它不应该被locking,但无论如何,这是你如何做到这一点:

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

如果由于某种原因,您的构build机器的login钥匙串被locking,并且您不想在脚本中公开该密码,那么您应该使用不同的钥匙串。 您可以在现场创build一个,并使用上一个命令和下一个命令。 现场创build一个:

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

然后使用-A参数将您的证书和关联的私钥导入login钥匙串。 请注意,你不需要sudo这一切…

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

-A参数是什么将使您的私钥设置为“允许所有应用程序访问此项目”

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

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

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

对我来说,没有什么工作似乎必须重新安装Xcode。 jenkins不断给出同样的错误。 如果您将Xcode安装到垃圾箱并重新安装,您将节省大量时间。 确保至less从命令行运行codesign命令。

即使之后,如果你得到相同的错误尝试设置“解锁钥匙串? 财产内Jenkins和path给你的login.keychain下/Users/${USER}/Library/Keychains/login.keychain

我希望这之后神会和你在一起。

尝试了一些上述解决scheme之后。 我意识到我有一个因素,就是我使用ION控制台开始构build。 当我切换回从terminal应用程序构build,一切工作得很好。

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

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

在创build临时钥匙串之后立即。

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

解决方法是,如果Jenkins使用JNLP而不是SSH连接到从服务器,则可以进行密码设置。

所以我在这里尝试了每一个答案,而且有些东西并没有加起来。 最后,我想通了,当我重新启动我的CI服务,它运行在一个不同的用户比我预期的。 切换到实际上有权访问其login链中的密钥的用户修复了一切。 这可能不是一个普遍的问题,但是要logging我的这个错误的具体原因,以防万一发生在别人身上。

对于我来说,当手动添加第二个钥匙串并将其locking时,会发生这种情况。 由于某些原因,即使证书在login钥匙串中(并被解锁),密码签名也会尝试访问locking的钥匙串并失败。 解锁第二个解决了这个问题。 只是对我没有意义。