Jenkinsで自動ビルドが実行されています。ビルド自体はスレーブ上で実行されており、スレーブはSSHを介して実行されます。
エラーが発生します:
00:03:25.113 [codesign-app] build/App.app: User interaction is not allowed.
私はこれまでに他の投稿で見たすべての提案を試しました:
いずれの場合も、同じエラーが発生します。
問題を診断するために、ローカル端末で「security unlock-keychain」コマンドを実行してみましたが、実際にはキーチェーンのロックが解除されないことがわかりました。KeychainAccessを見ると、ロック記号がまだ残っています。これは、コマンドラインでパスワードを渡すか、パスワードを要求するようにするかです。 GUIを使用して同じキーチェーンのロックを解除すると、パスワードの入力を求められてからロックが解除されます。さらに、「security lock-keychain」を実行すると、コマンドを実行した直後にキーロックが表示されますdo。これにより、ロック解除キーチェーンが実際に機能しないと思うようになります。 Lion(ビルドスレーブに使用している)とMavericks(開発中)で同じ動作を経験します。
次に、すべてのセキュリティコマンドに-vを追加してみました。
list-keychains "-d" "system" "-s" "/Users/tester/.secret/App.keychain"
Listing keychains to see if it was added: ((
"/Library/Keychains/System.keychain"
))
unlock-keychain "-p" "**PASSWORD**" "/Users/tester/.secret/App.keychain"
build/App.app: User interaction is not allowed.
このことから、リストキーチェーンが機能していないように思われます。たぶんどちらも動作しません。 :/
同様の質問 があります。ソリューションは興味深いです-launchctlで「SessionCreate」をtrueに設定します。しかし、私はマスターでビルドしていません-ビルドプロセスはスレーブビルドマシン上のSSHから開始されます。 「SessionCreate」を実行するときにlaunchctlが実行していることを実行するコマンドラインの方法がありますか?
ええと、今日は自分の質問に答えることができると思います。2日半かけて突き刺した後、私が試したことがうまくいったようです。私は今それから離れて、それが機能し続けることを願っています。
基本的に、実際には動作しない-d system
に帰着するように見えます。したがって、ここにある他の質問に対する多くの回答は、おそらくそれを反映するように更新されるべきです。
security -v list-keychains -s "$KEYCHAIN" "$HOME/Library/Keychains/login.keychain"
security list-keychains # so we can verify that it was added if it fails again
security -v unlock-keychain -p "$KEYCHAIN_PASSWORD" "$KEYCHAIN"
codesign --sign "$SIGNER_IDENTITY" --force --signature-size 9600 \
--resource-rules src/AppResourceRules.plist --timestamp --verbose \
"$APP"
私もこれと戦っています。 http://devnet.jetbrains.com/thread/311971 で提案を試みるまで何も助けにならなかった。 ashish agrawalに感謝します!
GUIを使用してビルドユーザーにログインし、キーチェーンアクセスを開きます。署名秘密鍵を選択し、右クリックして[情報を見る]を選択し、[アクセス制御]タブに変更して、[すべてのアプリケーションにこのアイテムへのアクセスを許可する]を選択します。
他の答えはどれも私にとってはうまくいきませんでした。
最終的に私を救ったのは この投稿
まとめると、これはデフォルトのタイムアウトである5分が原因である可能性があります。これは、長いビルドの後にこのエラーをトリガーします。
修正するには:
security set-keychain-settings -t 3600 -l ~/Library/Keychains/login.keychain
security unlock-keychain
およびcodesign
を1行のコマンドとして呼び出してみてください。これは私を助けました。何かのようなもの:
security unlock-keychain -p <password> /Users/<user>/Library/Keychains/login.keychain && codesign --force --verify --verbose --sign "<certificate id>" <app name>
システムキーチェーンにキーを入れます
証明書をインポートし、コード署名をプログラムで機能させることは、ログインまたはシステムキーチェーンを使用したり、コード署名の神に祈ったりすることではありません。正しい権限を設定する必要があります。特にコード署名の目的で新しいキーチェーンを作成することをお勧めします。
codesign
を取得しないためにerrSecInternalComponent
を取得する最近では、パーティションリスト(ACL)を正しく取得する必要があります。手順を説明します。
security create-keychain -p "${KEYCHAIN_PASSWORD}" "${KEYCHAIN_NAME}"
この時点で、キーチェーンはロック解除されますが、Keychain Access
には表示されません。
security list-keychains -s "${KEYCHAIN_NAME}" "${OLD_KEYCHAIN_NAMES[@]}"
新しいキーチェーンをリストに追加します。最初にlist-keychains
から元のリストを取得しないと、検索リストにlogin.keychain
が含まれなくなります。
security unlock-keychain -p "${KEYCHAIN_PASSWORD}" "${KEYCHAIN_NAME}"
上記のキーチェーンを作成した場合、これは冗長ですが、キーチェーンが既に存在する場合は必要です。
security set-keychain-settings "${TESTING_KEYCHAIN}"
引数を指定しないと、自動ロックタイムアウトが無制限に設定され、スリープ時の自動ロックが解除されます。
security import "${DIST_CER}" -P "${CERTIFICATE_PASSWORD}" -k "${KEYCHAIN_NAME}" -T /usr/bin/codesign
証明書をインポートし、-T
オプションを使用してcodesign
アクセスを許可します。
security set-key-partition-list -S Apple-tool:,Apple: -s -k "${KEYCHAIN_PASSWORD}" "${KEYCHAIN_NAME}"
これは多くの人が見逃している要件です。 dump-keychainを使用すると、macOSの機能を確認できます。コード署名の場合は、Apple:
とApple-tool:
が必要です。 -s
は証明書の署名を指します。
CIタイプのランナーまたはビルドシステムにとって非常に重要なことは、プロセスがlaunchd
から正しく開始されることを確認することです。 plistに<SessionCreate> </true>
が含まれていることを確認してください。
キーチェーンの所有者をビルドプロセスと正しく一致させず、セキュリティセッションが作成されていることを確認すると、あらゆる種類の頭痛の種になります。診断的に言えば、list-keychains
を導入して、出力が期待と一致するかどうかを確認できます。
これは、launchd.plist
manページからのものです。
SessionCreate <boolean>
このキーは、コンテキストのデフォルトのセッションが属するのではなく、ジョブが新しいセキュリティ監査セッションに生成されることを指定します。詳細については、auditon(2)を参照してください。
UserName <string>
このオプションのキーは、ジョブを実行するユーザーを指定します。このキーは、特権システムドメインにロードされるサービスにのみ適用されます。
GroupName <string>
このオプションのキーは、ジョブを実行するグループを指定します。このキーは、特権システムドメインにロードされるサービスにのみ適用されます。 UserNameが設定され、GroupNameが設定されていない場合、グループはユーザーのプライマリグループに設定されます。
find-identity
を使用して署名証明書のハッシュを検索できます
security find-identity -p codesigning -v
/usr/bin/codesign --verbose=4 -f -s "$SIGNER_HASH" "$SIGNABLE"
/usr/bin/codesign --verbose=4 -f -s "$SIGNER_HASH" --entitlements entitlements.xcent "$SIGNABLE"
最後の注意事項-Xcodeの動作を見ると、CODESIGN_ALLOCATE
ではなくXcodeに含まれているものを使用するように/usr/bin
を設定します。
export CODESIGN_ALLOCATE="$( xcrun --find codesign_allocate )"
検索パスは${PLATFORM_PATH}:${TOOLCHAIN_PATH}:${PATH}
に設定されます。PLATFORMパスは指定されたターゲットSDKの/ usr/binディレクトリであり、TOOLCHAIN_PATHはXcodeホストツールの/ usr/binです。
これが機能するコマンドです。 -A
は、Macがパスワードを要求しないようにするためのものです。 system.keychainへのインポートにはGUIは必要ありません。
Sudo security import <cert.p12> -k "/Library/Keychains/System.keychain" -P <passphrase> -A
キーチェーンがロックされました。それ抵抗その事実を変える私の進歩...
Keychain Access
-> Keychain First Aid
-> Repair
、etvoilá!
キーチェーンのロックを解除するだけでは不十分です。また、秘密キーのアクセスを「すべてのアプリにこのアイテムへのアクセスを許可する」に設定する必要があります。そして、コマンドラインからそれを行うには、キーを再インポートする必要があります。だから一度に物事を取る:
ログインキーチェーンがロックされている場合は、ロックを解除します。ロックするべきではありませんが、とにかくこれを行う方法は次のとおりです。
security -v unlock-keychain -p "$KEYCHAIN_PASSWORD" "~/Library/Keychains/login.keychain"
何らかの理由でビルドマシンのログインキーチェーンがロックされており、そのパスワードをスクリプトで公開したくない場合は、別のキーチェーンを使用する必要があります。その場で作成して、前のコマンドと次のコマンドで使用できます。その場で作成するには:
security create-keychain -p 'temporaryPassword' MyKeychain.keychain
security list-keychains -d user -s login.keychain MyKeychain.keychain
次に、-Aパラメーターを使用して、証明書と関連する秘密キーをログインキーチェーンにインポートします。このすべてのためにSudoをする必要がないことに注意してください...
security import <cert.p12> -k "~/Library/Keychains/login.keychain" -P <passphrase> -A
-Aパラメーターは、秘密キーを[すべてのアプリにこのアイテムへのアクセスを許可する]に設定するものです
したがって、これらすべてを使用して、必要な証明書をインストールしてリリースipaを作成し、プロンプトなしで署名するスクリプトを作成できるはずです。 .p12ファイルをリポジトリに保存できるため、どのマシンでも手動セットアップを必要とせずにipaを構築できます。
だから私はここですべての答えを試してみましたが、何かが十分に足りませんでした。最後に、CIサービスを再起動すると、予想していたのとは異なるユーザーで実行されていたことがわかりました。ログインチェーンのキーに実際にアクセスできるユーザーに変更すると、すべてが修正されました。これは一般的な問題ではないかもしれませんが、他の人に起こった場合に備えて、このエラーの特定の理由を文書化したかったのです。
キーをシステムキーチェーンにインポートします。次のコマンドを使用できます。
Sudo security import YourKey.p12 -k /Library/Keychains/System.keychain -P PasswordToYourKey -T /usr/bin/codesign
私にとっては、手動で追加された2番目のキーチェーンがあり、ロックされている場合に発生します。何らかの理由で、codesign
はロックされたキーチェーンへのアクセスを試み、証明書がログインキーチェーン内にある(およびロック解除されている)場合でも失敗します。 2番目のロックを解除すると、問題が解決します。私には意味がありません。
私の場合、これはデフォルトのタイムアウト300秒で作成されたキーチェーンと、300秒以上続く長いXcodeコンパイルが原因でした。私にとっての回避策は、以下を呼び出すことでした:
security set-keychain-settings -t <longer timeout in seconds> <keychain>
一時キーチェーンを作成した直後。
私にとっては、Xcodeを再インストールする必要はありませんでした。 Jenkinsは同じエラーを出し続けます。 Xcodeのインストールをゴミ箱に移動して再インストールするだけで時間を節約できます。少なくとも一度コマンドラインからcodesignコマンドを実行してください。
同じエラーが発生した場合でも、「キーチェーンのロック解除」を設定してみてください。 Jenkins内のプロパティおよび/Users/${USER}/Library/Keychains/login.keychainの下のlogin.keychainへのパスを指定します
その後、神様があなたと一緒にいることを願っています。
私はこれらすべての提案を実行しましたが、Jenkinsの仕事でfastlaneのgym
を使用する際にまだ問題がありました。証明書をインストールし、キーチェーンのロックを解除し、コマンドラインでcodesignコマンドを手動で実行すると、スレーブでコード署名できました。
回避策として、JenkinsがSSHの代わりにJNLPを使用してスレーブに接続する場合、コード署名することができます。