【问题标题】:Running xcodebuild from a forked terminal从分叉终端运行 xcodebuild
【发布时间】:2010-10-09 07:55:33
【问题描述】:

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

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

xcodebuild -configuration AdHoc -sdk iphoneos2.2 clean build

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

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

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

感谢您的帮助

【问题讨论】:

  • 你可以粘贴你用来启动终端的命令吗?
  • 第一个终端打开 Terminal.app 第二个带屏幕
  • 这个问题可以用sudo解决吗?
  • 我刚刚尝试使用各种 sudo 组合运行命令,但总是出现相同的 CodeSign 错误
  • 无论解锁登录钥匙串,这个问题仍然会出现。唯一对我有用的是使用钥匙串访问应用程序并将分发/临时证书+密钥复制到系统钥匙串中。

标签: iphone xcode xcodebuild


【解决方案1】:

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

$ 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

有什么想法吗?

【讨论】:

  • 使用 Keychain Access 应用程序,手动将所需证书从 Login keychain 复制到 System keychain。
  • 支持,谢谢!这对我来说可以。但我有点担心 - 这是正确的方案吗?谢谢
  • 当您只看到两个 System.keychains 时,您可能是以 root 身份运行该命令,而不是您的用户。当我不小心以 root 而不是我的用户运行 Bamboo 持续集成服务器并尝试构建和签署应用程序时,我遇到了这个确切的问题。
【解决方案2】:

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

【讨论】:

  • 不适合我。如果我以交互方式登录到构建帐户,我可以将钥匙串添加到我的搜索列表中。如果我以其他人身份登录,则无法登录。
【解决方案3】:

正如另一张海报所说,

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

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

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

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

不允许用户交互

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

【讨论】:

  • 您是否找到解决方案“如何共享”登录或任何钥匙串?我的意思是使用 ssh 或其他方式(不是 GUI)来使用钥匙串。
【解决方案4】:

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

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 

【讨论】:

  • 您可能希望将这些 cmets 复制到您的原始问题中,而不是将它们作为“答案”
  • 这是我打算做的,但是太长了,无法放入评论中。并且无法格式化 AFAIK cmets。
  • 它也对我有用,但我必须将 iPhone 钥匙串设置为默认值,因为 xcodebuild 似乎只使用默认值。可能对某人有所帮助。
  • 在我手动将登录钥匙串中的证书复制到系统钥匙串之前,上述方法都不适用于我。它还无需使用security 来解锁代码中的钥匙串
  • 请注意,还有另一个组件。访问控制列表。请参阅下面的答案。
【解决方案5】:

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

【讨论】:

    【解决方案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 中工作,并且所有钥匙串都可以访问,一切正常。

    【讨论】:

      【解决方案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
        "/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"
      

      ...神奇的事情开始在 Jenkins 中构建。哇……那是 对我来说大约 4 个小时就白费了。叹息。

      【讨论】:

      • 这解决了我的 TeamCity 构建器问题。谢谢!
      • “我最终把我的放在这里:/Library/Keychains/sysiphone.keychain”神奇地!!
      【解决方案8】:

      我做到了:

      • 从列表中删除login.keychain

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

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

      • 设为默认

      • 拨打security unlock-keychain就可以了

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

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

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

      【讨论】:

        【解决方案9】:

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

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

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

        1. here 所述以系统管理员身份登录
        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
        

        【讨论】:

          【解决方案10】:

          另一种解决方案:

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

          【讨论】:

          • 这对我在 TeamCity 构建中使用的新证书/密钥也有帮助。
          【解决方案11】:

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

          解决方法如下:

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

          2) 如果您遇到此错误,可能是您尝试为非登录用户运行codesign。在这种情况下,您显然无权访问“钥匙串访问”GUI。对于这些情况,您可以使用以下方法验证应用程序 &lt;null&gt; 缺少 sign 授权,这显然意味着所有应用程序,或者特别是 /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 "&lt;password&gt;" login.keychain

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

          【讨论】:

          • 非常感谢!这解决了我的问题。我将 /usr/bin/codedesign 添加到我的私钥中。
          • 将 /usr/bin/codesign 添加到私钥是解决我们的代码签名问题的解决方案。这应该是公认的答案。非常感谢!
          • -T 不再是同样的方式。您还必须设置分区列表。 stackoverflow.com/a/40039594/9636(嗨,马克!)
          【解决方案12】:

          解锁登录钥匙串对我不起作用。使用 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

          【讨论】:

            【解决方案13】:

            如果您正在运行 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 项目,但代码签名将首先检查自定义钥匙串,如果您已解锁它,则成功。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2015-01-14
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2018-11-17
              • 2011-05-06
              相关资源
              最近更新 更多