59

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

我已经成功设置了 xcode xcode 来执行临时构建,我还可以从命令行启动构建:

xcodebuild -configuration AdHoc -sdk iphoneos2.2 clean build

我遇到的问题是以下行在分叉终端(使用 nohup 或 screen)上不起作用,并且因以下原因而失败

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

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

谢谢你的帮助

4

13 回答 13

91

我有一个错误不允许用户交互并通过首先解锁钥匙串来解决它

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 
于 2009-02-24T08:59:49.430 回答
30

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

解决方法如下:

1) 如果您有权访问 Keychain Access GUI,那么您可以手动授予每个程序或 /usr/bin/codesign 访问权限,方法是右键单击您的私钥,选择“访问控制”选项卡,然后选择“允许所有应用程序”访问此项目”单选或“始终允许这些应用程序访问”列表。

2) 如果您遇到此错误,则可能是您尝试codesign为非登录用户运行。在这种情况下,您显然无权访问“钥匙串访问”GUI。对于这些情况,您可以验证signapplication 缺少的授权<null>,这显然意味着所有应用程序,或者特别/usr/bin/codesign是通过使用:

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

于 2013-02-07T21:11:33.370 回答
12

另一个解决方案:

  • 打开钥匙串访问
  • 右键单击私钥
  • 选择“获取信息”
  • 选择“访问控制”选项卡
  • 单击“允许所有应用程序访问此项目”
  • 点击“保存更改”
  • 输入您的密码
  • 享受
于 2012-09-02T11:08:22.507 回答
9

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

于 2009-02-23T22:28:47.153 回答
7

与 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您会得到:

$ 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 小时。叹。

于 2012-04-06T07:46:14.987 回答
6

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

security unlock-keychain login.keychain

其次是(空)密码,

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

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

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

    ssh someuser@localhost ~/build-script

所以它可以在真正的 tty 中工作,并且所有钥匙串都可以访问,一切正常。

于 2011-10-27T13:25:04.103 回答
4

正如另一张海报所说,

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

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

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

如果您尝试 ' security show-keychain-info keychain-file' 那么您将收到以下错误:

不允许用户交互

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

于 2009-02-23T23:35:23.780 回答
2

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

security -v list-keychains -d system -s ~/Library/Keychains/iOS.keychain; security -v unlock-keychain -p 密码 ~/Library/Keychains/iOS.keychain;

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

于 2013-05-30T22:36:21.683 回答
2

我查看了安全命令,似乎分配给我的终端的钥匙串在分叉时并不相同。如果我在终端中启动安全命令,我有:

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

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

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

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

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

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

有任何想法吗?

于 2009-02-23T20:18:44.983 回答
2

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

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

最终对我有用的是执行以下操作:

  1. 如此处所述,以系统管理员身份登录
  2. 创建仅签名的钥匙串(例如,ios.keychain
  3. 向其中添加签名证书(连同 WWDRCA 证书)

通过在终端上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
于 2012-04-19T09:28:40.280 回答
2

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

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

要保留 login.keychain:

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

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

于 2013-10-15T23:39:33.713 回答
1

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

于 2009-02-25T06:57:39.433 回答
0

我做了:

  • login.keychain从列表中删除

  • 创建自己的钥匙串$HOME/Library/Keychains/

  • 将其添加到钥匙串列表(我没有指定任何特定域)

  • 将其设置为默认值

  • 打电话security unlock-keychain给它

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

  • 向其导入私钥以及开发和分发证书

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

于 2012-04-16T08:32:59.543 回答