从分叉终端运行xcodebuild

时间:2009-02-23 14:11:22

标签: iphone xcode xcodebuild

我正在尝试为iPhone应用程序设置自动构建服务器。我希望能够安装夜间特殊版本,以便测试人员可以跟踪开发。

我已成功设置xcode xcode以执行adhoc构建,我也可以从命令行启动构建:

  

xcodebuild -configuration AdHoc -sdk iphoneos2.2 clean build

我遇到的问题是以下行无法使用分叉终端(使用nohup或屏幕)并且使用以下内容失败

  

CodeSign错误:代码签名标识'iPhone分发:XXXXX'与您的钥匙串中的任何代码签名证书都不匹配。添加到钥匙串后,触摸文件或清理项目以继续。

我已经在我的shell和nohup或屏幕中检查了我的环境变量,但没有找到线索。 我想我的问题是分叉终端无法访问钥匙串,但我不知道如何允许它。

感谢您的帮助

13 个答案:

答案 0 :(得分:90)

我有错误不允许用户互动并通过首先解锁钥匙链解决了这个问题

security unlock-keychain /Users/yannooo/Library/Keychains/login.keychain

我也尝试将我的证书放在系统的钥匙串中,它正在运行。 我的最终解决方案是使用 Keychain Access 应用程序将所有与iPhone相关的证书放在名为iPhone.keychain的专用钥匙串中

security list-keychains -s /Users/yannooo/Library/Keychains/iPhone.keychain 
security unlock-keychain -p keychainpassword /Users/yannooo/Library/Keychains/iPhone.keychain 

答案 1 :(得分:28)

这有两个(可能是三个!)组件。一个是钥匙串必须解锁。其次,在钥匙串内部有一个访问控制列表,用于告知处于解锁状态的应用程序的权限。因此,即使您已成功解锁了钥匙串,如果访问私钥并使用它签名的能力未被授予/usr/bin/codesign,那么您仍然会收到此消息。最后,如果您使用的是Mac OS Sierra,则分配给密钥的默认分区ID不正确,以便与codesign二进制文件兼容。

解决方案如下:

1)如果您有权访问Keychain Access GUI,那么您可以通过右键单击您的私钥,选择"访问控制"来手动授予每个程序或/ usr / bin / codesign访问权限。选项卡,然后选择"允许所有应用程序访问此项目"无线电或"始终允许这些应用程序访问"名单。

2)如果您遇到此错误,可能是您尝试为非登录用户运行codesign。在这种情况下,您显然无法访问&#34; Keychain Access&#34; GUI。对于这些情况,您需要验证应用程序sign缺少<null>授权,这显然意味着所有应用程序,或者具体使用/usr/bin/codesign {/ p>}

security dump-keychain -i login.keychain

但是,由于某种原因,您无法在交互模式下添加或修改访问控制属性 - 只能删除!实际上,您必须手动删除密钥并将其重新添加到指定-T标志的密钥链中。

security import login.keychain -P "<password>" -T /usr/bin/codesign

-T指定的位置

-T  Specify an application which may access the imported key (multiple -T options are allowed)

3)如果您使用的是Mac OS Sierra,请修改分区ID以包含apple分区。据推测,这是分配给codesign的命名空间,因为它是由Apple分发的。

security set-key-partition-list -S apple-tool:,apple: -k "<password>" login.keychain

注意apple-tool分区由security工具插入,因此上面的命令会保留该分区。有关此方面的详细信息,请参阅:http://www.openradar.me/28524119

答案 2 :(得分:11)

另一种解决方案:

  • 打开钥匙串访问
  • 右键单击私钥
  • 选择“获取信息”
  • 选择“访问控制”标签
  • 点击“允许所有应用程序访问此项”
  • 点击“保存更改”
  • 输入您的密码
  • 享受

答案 3 :(得分:9)

您是否可以在构建过程中使用security list-keychains -s ${HOME}/Library/Keychains/login.keychain将您的登录密钥链显式添加到搜索列表中?从分叉终端看来,构建过程看不到您的用户密钥链。如果钥匙串搜索列表基于您当前的安全会话,这可能是有意义的 - 分叉的终端会话将使登录会话就像您ssh通过环回连接一样。

答案 4 :(得分:6)

好的,问题对我来说有两件事,第一件就是解锁钥匙扣;

security unlock-keychain login.keychain

第二个是(空)密码,

security import blahblahbackup.p12 -k login.keychain -T /usr/bin/codesign -P ""

更新: 当脚本从web脚本或某事件触发时,A稍后会遇到一些问题。像那样。它只是看到/Library/Keychains/System.chain。所以我找到了一个肮脏的解决方法(这可能导致安全问题,但对我来说还可以);

  • 设置pubkey ssh登录(从想要调用构建脚本的用户,到具有证书并将运行xcodebuild的实际用户)在我的情况下,它是同一个用户。 Apache正在someuser工作,构建的所有内容都在someuser上设置。
  • 我的php脚本(用于触发构建)正在调用〜/ build-script。我改变了这样:

    ssh someuser @ localhost~ / build-script

所以它适用于真正的tty,并且所有钥匙串都可以访问,一切正常。

答案 5 :(得分:6)

更新与Jenkins遇到类似问题的人:

如果您将Mac设置为通过LaunchDaemons启动jenkins,则需要确保添加

<key>SessionCreate</key>
<true />

所以整个ci.plist看起来都是这样的:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
 <key>Label</key>
 <string>Jenkins</string>
 <key>UserName</key>
 <string>user</string>
 <key>GroupName</key>
 <string>staff</string>
 <key>ProgramArguments</key>
 <array>
 <string>/usr/bin/java</string>
 <string>-Xmx512m</string>
 <string>-jar</string>
 <string>/path/to/jenkins/jenkins.war</string>
 </array>
 <key>RunAtLoad</key>
 <true/>
 <key>KeepAlive</key>
 <true/>
 <key>EnvironmentVariables</key>
   <dict>
     <key>JENKINS_HOME</key>
     <string>/path/to/jenkins/home</string>
   </dict>
 <key>SessionCreate</key>
 <true />
</dict>
</plist>

我和上面的很多人一样,都遇到了同样的问题。 具体来说,我从Jenkins shell运行时遇到了这个问题 脚本我得到了相同**不允许用户交互**错误。 从ssh shell运行时,我的脚本工作正常。

大多数人也看到的差异是,如果你跑 你会得到安全列表 - 钥匙串

$ security list-keychain
  "/Library/Keychains/System.keychain"
  "/Library/Keychains/System.keychain"

但是当在ssh shell中运行时,我会得到:

$ security list-keychain
    "/Users/<i>user_account_name</i>/Library/Keychains/login.keychain"
    "/Library/Keychains/System.keychain"

大多数人都会在用户中拥有所有的密钥/证书等 帐户钥匙串。像一些人建议的那样,很容易做出新的 与用户密钥链不同的密钥链,并将其重新开发 你的XCode签名的东西。我最终把我放在这里: /Library/Keychains/sysiphone.keychain

我认为问题在于我的设置(也可能是你的设置), 您正在另一个安全首选项域(系统中)运行 与用户)。最后 - 这是我如何让我的sysiphone.keychain显示 起来:

$ sudo security list-keychains -d system -s "/Library/Keychains/sysiphone.keychain"
Password: *****
$ security list-keychains -d system
    "/Library/Keychains/sysiphone.keychain"

......神奇的事情开始在詹金斯建立。哇......那是 对我来说大约需要4个小时。叹息。

答案 6 :(得分:4)

正如另一张海报所说,

security list-keychains -s  "~/Library/Keychains/login.keychain"

但我认为您在登录时只能访问login.keychain,在GUI上下文中(我刚刚通过SSH和屏幕在系统上测试过,但我也碰巧通过VNC登录)。

显然可以使用launchctl来选择GUI上下文并运行程序,但我怀疑它只适用于“登录用户”。

如果您尝试'security show-keychain-info keychain-file',则会收到以下错误:

  

不允许用户互动

这是一个用于搜索更多信息的短语。 另一种解决方案是将证书放入您的系统钥匙串!

答案 7 :(得分:2)

我查看了安全命令,看来分配给我的终端的钥匙串在分叉时是不一样的。如果我在终端中启动了安全命令,我有:

$ security list-keychains
  "/Users/yannooo/Library/Keychains/login.keychain"
  "/Library/Keychains/System.keychain"

而使用 screen 时,我有以下输出:

$ security list-keychains
    "/Library/Keychains/System.keychain"
    "/Library/Keychains/System.keychain"

由于我的构建证书存储在登录密钥链中,因此代码签名错误看起来很正常。

有谁知道如何将钥匙串分配给终端?我试过这个没有成功

security login-keychain -s /Users/yannooo/Library/Keychains/login.keychain

有什么想法吗?

答案 8 :(得分:2)

我正在使用Atlassian Bamboo 2.7和OS X 10.7.3 Lion,我已尝试在线程中找到的每种方法,但我仍然收到“不允许用户交互”错误。

问题在于,在远程终端会话中(如“超级用户”,例如Bamboo或其他自动构建系统),需要解锁的包含签名证书的钥匙串与您正常情况下的钥匙串不同当你不是超级用户时,请参阅(例如Yann在here中所示)。

最终对我有用的是做以下事情:

  1. 按照here
  2. 所述以系统管理员身份登录
  3. 创建仅限签名的钥匙串(例如ios.keychain
  4. 向其添加签名证书(以及WWDRCA证书)
  5. 通过在终端上转su并运行security list-keychains来验证它。您应该在列表中看到ios.keychain。 (sudo security list-keychains不会显示相同的内容):

    sh-3.2# security list-keychains
    "/private/var/root/Library/Keychains/login.keychain"
    "/Library/Keychains/ios.keychain"
    "/Library/Keychains/System.keychain"
    

    我发现在执行unlock-keychain命令之前,您仍然需要将ios.keychain添加到搜索范围。在构建脚本中,运行以下行:

    KEYCHAIN=/Library/Keychains/ios.keychain
    # the -s option adds $KEYCHAIN to the search scope, while the -d option adds $KEYCHAIN to the system domain; both are needed
    security -v list-keychains -d system -s $KEYCHAIN 
    security -v unlock-keychain -p bambooiphone $KEYCHAIN
    

答案 9 :(得分:2)

解锁登录钥匙串对我不起作用。使用Keychain Access(称为iOS)创建单独的钥匙串,然后将这些命令添加到构建中(确实运行Jenkins作为我自己的用户时):

security -v list-keychains -d system -s~ / Library / Keychains / iOS.keychain;安全-v unlock-keychain -p password~ / Library / Keychains / iOS.keychain;

但这看起来更有希望:https://wiki.jenkins-ci.org/display/JENKINS/Xcode+Plugin#XcodePlugin-Userinteractionisnotallowed

答案 10 :(得分:2)

如果您正在运行security list-keychains并且看到您的自定义钥匙串在列表中显示为某个地方,但它仍然无法正常工作,则可能是您遇到了我遇到的问题从搜索列表中按顺序检查钥匙串,因为我在SSH会话中没有解锁login.keychain,它会在那里失败而不是移动到列表中的下一个钥匙串,这是自定义一个我想解锁的。

将搜索列表设置为您使用security unlock-keychain解锁的自定义钥匙串。使用Yann的答案中的这种方法也会从搜索列表中删除你的login.keychain。

保留login.keychain:

security list-keychains -s ~/Library/Keychains/custom.keychain ~/Library/Keychains/login.keychain

这样,当在计算机上使用GUI会话时,您仍然可以访问login.keychain个项目,但代码签名将首先检查自定义钥匙串,如果您已将其解锁,则会成功。

答案 11 :(得分:1)

如果您以root身份执行xcodebuild(您在sudo时执行),则需要以root用户身份登录并将签名证书放入root的密钥链中。然后使用上述安全解锁钥匙链。

答案 12 :(得分:0)

我做了:

  • 从列表中删除login.keychain

  • $HOME/Library/Keychains/

  • 中创建自己的钥匙串
  • 将其添加到钥匙串列表中(我没有指定任何特定域名)

  • 将其设为默认

  • 在其上调用security unlock-keychain

  • 向其添加全局签名证书(WWDRCA)

  • 将私钥及开发和分发证书导入其中

如果有login.keychain,我仍然会收到“不允许用户互动”错误。 因此,使用login.keychain删除security delete-keychain最终会有所帮助!