web-dev-qa-db-ja.com

Jenkins-Xcodeビルドが動作するcodesignが失敗する

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

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

ロック解除コマンドが本当に成功しないように振る舞います。コマンドラインから経由でコードサインを実行しようとすると

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.

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

34
mckeejm

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 Distribution:ACME Corporation」に解決されます)。これらのIDを別々のキーチェーンに保持することにより、この競合を回避します。

67
Jamieson

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

25
mckeejm

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

14
user2317738

この回答では、ログインキーチェーンを操作したり、デフォルトのキーチェーンを変更したりすることなく、iOS証明書を追加/削除します。

  1. 一時的なキーチェーンを使用する
  2. 一時的なキーチェーンを検索リストに追加する(置き換えない)
  3. タイムアウトなしで一時キーチェーンのロックを解除します
  4. -T /usr/bin/codesignを使用して証明書をインポートします
  5. ビルドする
  6. 一時キーチェーンを削除して証明書を削除する

一時的なキーチェーンを作成します。 PIDである$$を追加しました。これは、複数の一時キーチェーンを同時に作成できるようにすることで、スクリプトを並列化できることを意味します。

# Create temp keychain
MY_KEYCHAIN="MyKeychain-$$.keychain"
MY_KEYCHAIN_PASSWORD="secret"
security create-keychain -p "$MY_KEYCHAIN_PASSWORD" "$MY_KEYCHAIN"

検索リストに一時的なキーチェーンを追加します。 security list-keychains -sを使用してキーチェーンを追加するように注意してください。そうしないと、別のスレッドで実行されているビルドを上書きすることになります。

# Append keychain to the search list
security list-keychains -d user -s "$MY_KEYCHAIN" $(security list-keychains -d user | sed s/\"//g)
security list-keychains

自動再ロックタイムアウトなしで一時キーチェーンのロックを解除します(security set-keychain-settings)。再ロックタイムアウトの修正を忘れた場合、デフォルトの再ロックタイムアウトよりも時間がかかるビルドはパスワードプロンプトをトリガーします。

# Unlock the keychain
security set-keychain-settings "$MY_KEYCHAIN"
security unlock-keychain -p "$MY_KEYCHAIN_PASSWORD" "$MY_KEYCHAIN"

IOS証明書をインポートし、パスワードプロンプトを要求せずに/usr/bin/codesignアクセスを許可します。

# Import certificate
security import $CERT -k "$MY_KEYCHAIN" -P "$CERT_PASSWORD" -T "/usr/bin/codesign"

一時的なキーチェーンを使用し、証明書が1つしか含まれていないことがわかっているため、プログラムでIOS_IDENTITYを導出できます(ビルドステップへの入力として必要)。

# Detect the iOS identity
IOS_IDENTITY=$(security find-identity -v -p codesigning "$MY_KEYCHAIN" | head -1 | grep '"' | sed -e 's/[^"]*"//' -e 's/".*//')
IOS_UUID=$(security find-identity -v -p codesigning "$MY_KEYCHAIN" | head -1 | grep '"' | awk '{print $2}')

# New requirement for MacOS 10.12
security set-key-partition-list -S Apple-tool:,Apple: -s -k $MY_KEYCHAIN_PASSWORD $MY_KEYCHAIN

今すぐビルドしてください

# Insert your custom build steps

一時キーチェーンを削除します。これを行うと、検索リストから自動的にポップされることに注意してください。つまり、他のすべてのキーチェーンは残ります。

# Delete the temp keychain
security list-keychains
security delete-keychain "$MY_KEYCHAIN"
security list-keychains
10
Stephen Quan

1つだけがこの問題を解決しました。

私がしたことは、秘密鍵をキーチェーンアクセスの署名証明書Allow allに設定することですこのアイテムにアクセスするアプリケーション

enter image description here

6
raed

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

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

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

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
3
Graham Perks

FWIW ...これの別の考えられる理由を捨てさせてください。重複する証明書が散らばっていて、codesignがどの証明書を使用するかわからない場合があります。 Jenkinsスレーブからこのコマンドを実行すると、重複した有効な証明書が表示されますか?このようなもの:

$ security find-identity -v -p codesigning
  1) AAAAE00066DED2FE77DF43012573AD5B6188AAAA "iPhone Developer: JOHN SMITH (XAAAAFSUSJ)"
  2) AAAAE00066DED2FE77DF43012573AD5B6188AAAA "iPhone Developer: JOHN SMITH (XAAAAFSUSJ)"
  3) BBBB5B03DB566209964247982908D3DD74D1BBBB "iPhone Distribution: Example, Inc. (TBBBBH5HUE)"
  4) BBBB5B03DB566209964247982908D3DD74D1BBBB "iPhone Distribution: Example, Inc. (TBBBBH5HUE)"
  5) BBBB5B03DB566209964247982908D3DD74D1BBBB "iPhone Distribution: Example, Inc. (TBBBBH5HUE)"
  6) AAAAE00066DED2FE77DF43012573AD5B6188AAAA "iPhone Developer: JOHN SMITH (XAAAAFSUSJ)"
  7) AAAAE00066DED2FE77DF43012573AD5B6188AAAA "iPhone Developer: JOHN SMITH (XAAAAFSUSJ)"
  8) BBBB5B03DB566209964247982908D3DD74D1BBBB "iPhone Distribution: Example, Inc. (TBBBBH5HUE)"
  8 valid identities found

もしそうなら、私は次のことを行い、署名証明書のベースラインセットに戻ることが有用であることがわかりました。

  • Jenkinsスレーブ(およびビルドスクリプトを実行する他のJenkinsスレーブ)上のすべての証明書を削除します。
  • 次に:確認してください、0 identifiesを実行して$ security find-identity -v -p codesigningもう一度。
  • アプリケーションのリポジトリ内に、カスタムMyApp.keychain 2つの有効な証明書が含まれています。重複をすべて削除してください。
  • これで、ビルドスクリプトから、codesignプロセスがnlockMyApp.keychainをデフォルトとして設定します。これにより、codesignで利用可能な証明書が公開されます。
  • 最後に、Jenkinsスレーブで再度確認します:$ security find-identity -v -p codesigning表示されるonlyにバンドルした証明書MyApp.keychainおよびシステムに他の署名IDがないこと。これを行った後でも重複が見られる場合、Jenkinsスレーブがこれらの証明書を認識している他の場所があります。
3
Aaron

これはコード署名エラーです。xcodebuildコマンドは、証明書がSSHでJenkinsのスレーブを介して実行されているため、証明書の秘密キーにアクセスできません。

アクセスを許可するためにxcodebuildを実行する前に、シェルスクリプトで次の行を実行します。

security set-key-partition-list -S Apple-tool:,Apple: -s -k <ROOT-PASSWORD> /Users/<YOUR USER NAME>/Library/Keychains/login.keychain-db

お役に立てば幸いです!

1
Asaf Shveki

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

Codesignを使用してOSXアプリに署名しようとする 「ユーザーインタラクションは許可されていません」に対する回答をご覧ください

1
yonix

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

  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

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

1
CrazyJoeLv

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

0
magnusarinell