39

以下は私のビルドスクリプトです(xcodebuildプラグインを使用していません)。

  1. ビルドステップの作品
  2. 必要な証明書と秘密鍵を含む別のキーチェーンを作成しました。これらはキーチェーン アクセスに表示されます。
  3. スクリプトでキーチェーン コマンドが失敗しない
  4. security list-keychains は、これらを有効なキーチェーンとして示します

ロック解除コマンドが本当に成功しないように動作しています。コマンドラインからcodesignを実行しようとすると

codesign -f -s "iPhone Developer: mycert" -v sample.app/ --keychain /Users/Shared/Jenkins/Library/Keychains/JenkinsCI.keychain

私は得る

CSSM_SignData returned: 000186AD
sample.app/: unknown error -2070=fffffffffffff7ea

せいぜいできるので、コマンドラインから適切にエミュレートしているかどうかはわかりませんが

sudo -u jenkins bash

xcodebuild ONLY_ACTIVE_ARCH="NO" CODE_SIGN_IDENTITY="" CODE_SIGNING_REQUIRED="NO" -scheme "MySchemeName" CONFIGURATION_BUILD_DIR="`pwd`"
security list-keychains -s /Users/Shared/Jenkins/Library/Keychains/JenkinsCI.keychain
+ security default-keychain -d user -s /Users/Shared/Jenkins/Library/Keychains/JenkinsCI.keychain
+ security unlock-keychain -p jenkins /Users/Shared/Jenkins/Library/Keychains/JenkinsCI.keychain
+ security list-keychains
    "/Users/Shared/Jenkins/Library/Keychains/JenkinsCI.keychain"
    "/Library/Keychains/System.keychain"
+ security default-keychain
    "/Users/Shared/Jenkins/Library/Keychains/JenkinsCI.keychain"
+ codesign -f -s '$IDENTITY_GOES_HERE.' -v sample.app/
sample.app/: User interaction is not allowed.

どんな助けでも大歓迎です。

4

12 に答える 12

77

私たちは Jenkins を使用していませんが、ビルドの自動化でこれを見たことがあります。これを解決した方法は次のとおりです。

1) ビルド キーチェーンを作成します。これには、コード署名に使用される秘密鍵/証明書が含まれます。

security create-keychain -p [keychain_password] MyKeychain.keychain

keychain_password はあなた次第です。これは後でビルド中にキーチェーンのロックを解除するために使用します。

2) CodeSign ID の秘密鍵 (*.p12) をインポートします。

security import MyPrivateKey.p12 -t agg -k MyKeychain.keychain -P [p12_Password] -A

ここで重要なのは「-A」フラグです。これにより、警告なしでキーチェーンへのアクセスが許可されます。これが、「ユーザーの操作は許可されていません」というエラーが表示される理由です。Xcode UI を介してこのビルドを試みた場合、ここでキーチェーンへの「アクセスを許可する」ように求められます。

3) ただし、キーチェーンを保存する場合 (例: ソース管理にチェックインする場合)、ビルド ユーザーが書き込み可能で実行可能であることを確認してください。

ビルドの準備ができたら、xcodebuild を実行する前に以下を追加します。

# Switch keychain
security list-keychains -s "/path/to/MyKeyhain.keychain"
security default-keychain -s "/path/to/MyKeychain.keychain"
security unlock-keychain -p "[keychain_password]" "/path/to/MyKeychain.keychain"

ローカルで実行している場合は、ビルド スクリプトの最後に、ログイン キーチェーン (~/Library/Keychains/login.keychain) に切り替える何かを追加することをお勧めします。

# Switch back to login keychain
security list-keychains -s "~/Library/Keychains/login.keychain"
security default-keychain -s "~/Library/Keychains/login.keychain"

試してみてください。使用する ID ごとに個別のキーチェーンを作成します (お客様に代わって独自に構築したもの)。当社の場合、AppStore と Enterprise の両方のアカウントを持っています。これにより、コード署名中に名前の競合が発生する可能性があります (例: 両方のアカウントが「iPhone ディストリビューション: ACME Corporation」に解決されます)。これらの ID を別々のキーチェーンに保持することで、この競合を回避します。

于 2013-10-23T19:15:10.687 に答える
27

証明書をシステムキーチェーンに移動し、それを参照すると、問題が具体的に修正されました

于 2013-05-14T19:51:36.467 に答える
16

「security unlock-keychain -p」に署名する前に、キーチェーンのロックを解除する必要があります

于 2013-06-18T20:18:25.433 に答える
3

すべての証明書/秘密鍵を新しいキーチェーンにコピーしました (アイテムを右クリックして、単にコピーして貼り付けることができます)。新しいキーチェーンで、各秘密キーを右クリックし、[情報を取得] -> [アクセス コントロール] を選択して、すべてのアプリでキーを使用できるようにします。

重要なのは、キーチェーン アプリの左上にキーチェーンのリストがあることです。新しいキーチェーンがリストの最初になるように並べ替えます。

私が見つけた別の答えは、ビルド中にこのキーチェーンのロックを解除するためのビルドステップを与えました:

KEYCHAIN=/Users/<you>/Library/Keychains/codesign.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 <keychain password> $KEYCHAIN
于 2013-07-25T15:16:19.130 に答える
2

ここで私のために働いたもの:

  1. 新しいキーチェーンを作成し、「login」からすべてのエントリをコピーして、「jenkins_ios」という名前を付けました
  2. 新しいキーチェーンをデフォルトにしました。
  3. Jenkins 構成に新しい「シェルの実行」ステップを追加しました。これは、コード署名前の最初のステップである必要があり、次の内容が含まれます。

KEYCHAIN=/Users/<user>/Library/Keychains/jenkins_ios.keychain
security -v list-keychains -s $KEYCHAIN
security -v unlock-keychain -p <password> $KEYCHAIN
security set-keychain-settings -t 3600 -l $KEYCHAIN

デフォルトのロック解除タイムアウトは、プロジェクトを適切にビルドするには十分な長さではない可能性があるため、最後のステップは非常に重要です (プロジェクトは巨大でビルドステップに約 5 ~ 7 分かかり、その時点でキーチェーンがロックされたため、まさにこれがプロジェクトで発生しました)。これはコードサインに必要でした)。

于 2015-12-16T09:20:45.143 に答える
1

これは、キーチェーンのデフォルトのタイムアウトが原因である可能性もあります。

codesignを使用してOSXアプリに署名しようとする「ユーザーの操作は許可されていません」に対する私の回答を確認してください

于 2014-06-03T11:29:26.870 に答える
0

キーチェーン(ログインとシステム)から重複したキーを削除したところ、機能し始めました。証明書は 1 つしかありませんでしたが、多くのキーがあったため、適切に表示するにはキーをフィルター処理する必要がありました。

于 2017-12-01T12:01:56.483 に答える