web-dev-qa-db-ja.com

分岐したターミナルからxcodebuildを実行する

IPhoneアプリケーションの自動ビルドサーバーをセットアップしようとしています。テスターが開発をフォローできるように、アドホックベータ版を毎晩ビルドできるようにしたいと思います。

アドホックビルドを実行するためにxcodeを正常にセットアップしました。また、コマンドラインからビルドを起動することもできます。

xcodebuild -configuration AdHoc -sdk iphoneos2.2 clean build

私が抱えている問題は、次の行がフォークされた端末(Nohupまたは画面を使用)から機能せず、次のように失敗することです。

CodeSignエラー:コード署名ID 'iPhone Distribution:XXXXX'は、キーチェーン内のコード署名証明書と一致しません。キーチェーンに追加したら、ファイルをタッチするか、プロジェクトをクリーンアップして続行します。

シェルとNohupまたは画面で環境変数を確認しましたが、手がかりが見つかりませんでした。私の問題は、フォークされた端末がキーチェーンにアクセスできないことだと思いますが、それを許可する方法がわかりません。

ご協力いただきありがとうございます

58
Yann Biancheri

Teエラーが発生しましたユーザーの操作は許可されていません

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 
91
Yann Biancheri

これには2つ(おそらく3つ!)のコンポーネントがあります。 1つは、キーチェーンのロックを解除する必要があることです。次に、キーチェーン内に、ロック解除状態のアプリケーションに与えられるアクセス許可を示すアクセス制御リストがあります。したがって、キーチェーンが正常にロック解除された場合でも、秘密キーにアクセスして署名する機能が/usr/bin/codesignに与えられていない場合、このメッセージが表示されます。最後に、Mac OS Sierraを使用している場合、キーに割り当てられたデフォルトのパーティションIDは、codesignバイナリとの互換性を保つために正しくありません。

解決策は次のとおりです。

1)キーチェーンアクセスGUIにアクセスできる場合、プライベートキーを右クリックし、[アクセス制御]タブを選択して[すべてのアプリケーションを許可する]を選択することにより、すべてのプログラムまたは/ usr/bin/codesignアクセスを手動で許可できます[このアイテムにアクセスするには]ラジオまたは[これらのアプリケーションによるアクセスを常に許可する]リストのリスト。

2)このエラーが発生した場合、ログインしていないユーザーに対してcodesignを実行しようとしている可能性があります。この場合、明らかに「キーチェーンアクセス」GUIにアクセスできません。これらの場合、アプリケーション<null>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パーティションを含めます。おそらく、これはAppleによって配布されたため、codesignに割り当てられた名前空間です。

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

[〜#〜] note [〜#〜]Apple-toolパーティションはsecurityツールによって挿入されるため、上記のコマンドは、そのパーティションを保持します。この側面の詳細については、以下を参照してください。 http://www.openradar.me/28524119

29
markshiz

別の解決策:

  • キーチェーンアクセスを開く
  • 秘密鍵を右クリックします
  • [情報を見る]を選択します
  • 「アクセス制御」タブを選択します
  • 「すべてのアプリケーションにこのアイテムへのアクセスを許可する」をクリックします
  • [変更を保存]をクリックします
  • パスワードを入力してください
  • 楽しい
11

ビルドプロセス内でsecurity list-keychains -s ${HOME}/Library/Keychains/login.keychainを使用して、ログインキーチェーンを検索リストに明示的に追加できますか?分岐したターミナルからは、ビルドプロセスはユーザーキーチェーンを認識しないようです。キーチェーン検索リストが現在のセキュリティセッションに基づいている場合、これは理にかなっています。分岐したターミナルセッションは、ループバック接続を介してsshのようにログインセッションを終了します。

9
user23743

Jenkinsで同様の問題に直面している人向けの更新:

LaunchDaemonsを介してjenkinsを起動するようにMacを設定する場合は、必ず追加する必要があります

<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シェルから実行する場合、スクリプトは正常に機能しました。

ほとんどの人が見ている違いは、security list-keychainを実行すると次のようになることです:

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

しかし、sshシェルで実行すると、次のようになります。

$ 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

OK、問題は私にとって2つのことでした。1つ目はキーチェーンのロックを解除することでした。

security unlock-keychain login.keychain

2番目は(空の)パスフレーズでした。

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

更新:Aは、スクリプトがWebスクリプトまたはsthからトリガーされるときに、少し問題が発生しました。そのような。 /Library/Keychains/System.chainが表示されるだけです。だから私は汚い回避策を見つけました(これはセキュリティの問題につながるかもしれませんが、私にとっては大丈夫です);

  • 私の場合、pubkey ssh login(ビルドスクリプトを呼び出したいユーザーから、証明書を持ち、xcodebuildを実行する実際のユーザーへ)をセットアップします。これは同じユーザーです。 Apacheはsomeuserとして動作しており、ビルドのすべてがsomeuserにセットアップされています。
  • そして、私のPHPスクリプト(ビルドをトリガーするため)は〜/ build-scriptを呼び出していました。このように変更しました:

    ssh someuser @ localhost〜/ build-script

そのため、実際のttyで動作し、すべてのキーチェーンにアクセスでき、すべてが正常に動作します。

6
Furkan Mustafa

別のポスターが言うように、

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

しかし、GUIコンテキストでログインしている場合にのみlogin.keychainにアクセスできると思います(SSHと画面を介してシステムでテストしたばかりですが、VNCを介してログインすることもあります)。

Launchctlを使用してGUIコンテキストを選択し、プログラムを実行することは明らかに可能ですが、「ログインしているユーザー」に対しても機能すると思われます。

security show-keychain-info keychain-file '次のエラーが表示されます。

ユーザー操作は許可されていません

そして、それはさらに情報を探すためのフレーズです。もう1つの解決策は、証明書をシステムキーチェーンに配置することです!

4
jrg

セキュリティコマンドを確認しましたが、フォークされたときに端末に割り当てられたキーチェーンは同じではないようです。ターミナルでセキュリティコマンドを起動した場合、次のようになります。

$ 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

何か案は?

2
Yann Biancheri

Atlassian Bamboo 2.7とOS X 10.7.3 Lionを使用しており、スレッドで見つかったすべてのアプローチを試しましたが、「ユーザーインタラクションは許可されていません」というエラーが表示されていました。

問題は、リモート端末セッション(Bambooまたは別の自動ビルドシステムの場合のような「スーパーユーザー」として)で、署名証明書を含むロックを解除する必要があるキーチェーンが通常の表示と異なることです(そのようなスーパーユーザーではないときに here )でYannが示したように。

最終的に私のために働いたのは、次のことをすることでした:

  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
2
Aldrich Co

ログインキーチェーンのロック解除が機能しませんでした。キーチェーンアクセス(iOSと呼ばれます)を使用して別のキーチェーンを作成し、ビルドにこれらのコマンドを追加すると動作しました(自分のユーザーとしてJenkinsを実行している場合):

security -v list-keychains -d system -s〜/ Library/Keychains/iOS.keychain; security -v unlock-keychain -p password〜/ライブラリ/Keychains/iOS.keychain;

しかし、これはより有望に見えます: https://wiki.jenkins-ci.org/display/JENKINS/Xcode+Plugin#XcodePlugin-Userinteractionisnotallowed

2
Kyle Robson

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アイテムにアクセスできますが、コード署名は最初にカスタムキーチェーンをチェックし、ロックを解除すると成功します。

2
darvids0n

ルートとしてxcodebuildを実行している場合(これはSudoのとき)、ルートとしてログインし、署名証明書をルートのキーチェーンに配置する必要があります。次に、上記のセキュリティでキーチェーンのロックを解除します。

1
cdespinosa

やった:

  • リストからlogin.keychainを削除

  • $HOME/Library/Keychains/に独自のキーチェーンを作成します

  • キーチェーンリストに追加します(特定のドメインを指定しませんでした)

  • デフォルトとして設定

  • security unlock-keychainを呼び出します

  • グローバル署名証明書(WWDRCA)を追加します

  • 秘密鍵と開発および配布証明書の両方をインポートします

login.keychainがある場合、「ユーザーの操作は許可されていません」というエラーが引き続き表示されます。したがって、login.keychainを使用してsecurity delete-keychainを削除すると、ようやく役立ちました!

0
lef