「ユーザーの操作は許可されていません」コードサインを使用してOSXアプリに署名しようとしています


145

Jenkinsで自動ビルドが実行されています。ビルド自体はスレーブで実行されており、スレーブはSSH経由で実行されます。

エラーが発生します:

00:03:25.113 [codesign-app] build/App.app: User interaction is not allowed.

私はここの他の投稿でこれまでに見たすべての提案を試しました:

  • 署名の直前にセキュリティロック解除キーチェーンを使用して、キーチェーンのロックを解除します。
  • 署名キーを独自のキーチェーンに移動します。
  • 署名キーをログインキーチェーンに移動します。
  • 署名キーをシステムキーチェーンに移動します。
  • キーを含むキーチェーンのみにリストキーチェーンを手動で設定します。

すべての場合で、同じエラーが発生します。

この問題を診断するために、ローカル端末で「security unlock-keychain」コマンドを実行してみたところ、実際にはキーチェーンのロックが解除されないことがわかりました。キーチェーンアクセスを調べても、ロック記号は残っています。これは、コマンドラインでパスワードを渡す場合でも、パスワードを要求する場合でも同じです。GUIを使用して同じキーチェーンのロックを解除すると、パスワードの入力を求められ、ロックが解除されます。さらに、「セキュリティロックキーチェーン」を実行すると、コマンドの実行直後にキーロック表示されます。これにより、ロック解除キーチェーンは実際には機能しないと思います。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が実行していることを実行するコマンドラインの方法があるのでしょうか。


Circleciでキーチェーンパスワードを設定する方法?
Sachin Kumaram

@SachinKumaramは実行可能な新しい質問のように聞こえますか?
トレイカズ

回答:


205

私もこれと戦っています。http://devnet.jetbrains.com/thread/311971で提案を試すまで、何の助けにもなりませんでした。ashish agrawal、ありがとう!

GUIを介してビルドユーザーにログインし、キーチェーンアクセスを開きます。署名する秘密鍵を選択し、右クリックして[情報を見る]を選択し、[アクセス制御]タブに移動して、[すべてのアプリケーションにこのアイテムへのアクセスを許可する]を選択します。

アクセス制御タブ


2
どういたしまして。また、私のようにすべてのアプリケーションを許可するのではなく、下部のアプリケーションリストにコードサインを追加することを検討することもできます。スクリーンショットにはすでに表示されていますが、最初は表示されていなかったと思います。
bmauter

3
「常に許可」リストに追加するには、/ usrディレクトリをapple.stackexchange.com/a/34872/6052で再表示する必要がありましたcodesign
ヒースボーダーズ2014年

24
これに加えて、すべてのsecurity unlock-keychainことも行う必要があること注意してください
cwd

13
さらに、マシンでリモートビルドを実行するときにアクセスできるように、ログインからシステムにキーを移動することもできます。
クリスティアン2015年

8
コマンドラインからこれを行う方法を誰かが知っていますか?私のリモートビルドマシンでは、セキュリティ上の理由から、画面上での共有はできません。
devios1 2015年

78

ええと、今日は自分の質問に答えられると思います。2日半以上試してみたところ、試したことの1つはうまくいったようです。私は今、それから離れて、それが機能し続けることを願っています。

基本的には、-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"

17
ありがとう。これを絞り込むことができました。ビルドを試みる直前に次のコマンドを実行するだけです:security -v unlock-keychain -p "$ KEYCHAIN_PASSWORD" "$ HOME / Library / Keychains / login.keychain"
pir800

3
ではcodesign、実際にログインパスワードをスクリプト内に保存せずにssh経由でアクセスする方法はありませんか?
chakrit 2014

2
上記の例の@chakritでは、ログインパスワードではなく、キーチェーンパスワードのみを渡します。多くのユーザーにとって、ログインキーチェーンが唯一のキーチェーンであることに気づきましたが、私たちの場合、署名キーを別のキーストアに保持して、マシンを簡単に同期してビルドできるようにします。しかし、そうです、このようなことの多くは自動化されたビルドにはかなり不便に思われ、Appleが自動化されたビルドを実行するのかどうか疑問に思いました。
トレカズ

@Trejkaz大丈夫、少なくともキーチェーンのパスワードを共有することはそれほど悪くはありません。
チャクリット

自動リモートビルドの私の使用例で.envは、ファイルにキーチェーンパスワードを保存することはそれほど悪くありません.env。AWSとHeroku。私たちの場合、ビルド関連のコード署名資格情報は、新しく作成されたキーチェーンに格納され、ビルド後に削除されます。その後、次のビルドのために再作成されます。ただし、loginキーチェーンを開く必要があるため、security unlock-keychain -p pass login.keychain、ここにリンクがでした。ありがとう!
Petrus Repo 2015年

19

他の答えはどれもうまくいきませんでした。

最終的に私を救ったのはこの投稿でした

要約すると、これは5分というデフォルトのタイムアウトが原因である可能性があり、長いビルド後にこのエラーがトリガーされます。

修正するには:

security set-keychain-settings -t 3600 -l ~/Library/Keychains/login.keychain

2
El Capitanでは、ユーザーインターフェースからもそれを行うことができます。キーチェーンアプリを開き、キーチェーン(ログイン、システムなど)を右クリックして、「<your_keychain>の設定の変更」に最も一致するものをクリックします。
rubybeginner 2016

これConfirmにより、アクセスを変更した後でも、システムのキーチェーンアクセスが常に元に戻ります。:/
Alex Zavatone 2018年

参考になりました!!
Nori、

コメントを見つけるまで2日間も苦労してきました、ありがとう!!!
Gilad Novik

16

呼び出そうとするsecurity unlock-keychaincodesign1行のコマンドとして。これは私を助けました。何かのようなもの:

security unlock-keychain -p <password> /Users/<user>/Library/Keychains/login.keychain && codesign --force --verify --verbose --sign "<certificate id>" <app name>

4
これは、2行で行うのと同じです。違いは、最初のコマンドが失敗した場合、2番目のコマンドは実行されないことです。
Trejkaz 2014年

1
私にとって、彼らは同じではありません。私はそれらをant sshexecを介して呼び出し、毎回新しいsshセッションを作成します。
ZhekaKozlov、2014年

2
本当に望めば、1つのsshセッションで複数の行を実行することもできます。ですから、エラーの処理を除けば、それは同じです。
Trejkaz 2014年

13

セキュリティを使用して/ usr / bin / codesignのキーチェーンを作成する

証明書をインポートしてプログラムでcodesignと連携させることは、ログインやシステムキーチェーンを使用したり、コードサインの神に祈ったりすることではありません。正しい権限を設定する必要があるだけです。特にコードサインのために新しいキーチェーンを作成することをお勧めします。

最近で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}"

引数を指定しないことにより、これは自動ロックタイムアウトを無制限に設定し、スリープ時の自動ロックを削除します。

.p12から署名証明書をインポートする

security import "${DIST_CER}" -P "${CERTIFICATE_PASSWORD}" -k "${KEYCHAIN_NAME}" -T /usr/bin/codesign

証明書をインポートしcodesignて、-Tオプションます。

キーチェーンにACLを設定する

security set-key-partition-list -S apple-tool:,apple: -s -k "${KEYCHAIN_PASSWORD}" "${KEYCHAIN_NAME}"

これは多くの人が見逃している要件です。dump-keychainを使用すると、macOSの機能を確認できます。codesigningの場合のどちらが必要ですapple:apple-tool:-s証明書に署名することを指します。

Gitlab-Runner、Jenkinsなど

CIタイプのランナーまたはビルドシステムにとって非常に重要なことの1つは、プロセスがlaunchd正しく開始されることを確認することです。plistにが含まれていることを確認してください<SessionCreate> </true>

キーチェーンの所有者とビルドプロセスを正しく一致させず、セキュリティセッションが作成されていることを確認すると、さまざまな問題が発生します。診断的に言えlist-keychainsば、出力を導入し、出力が期待と一致するかどうかを確認できます。

これはlaunchd.plistマンページからです:

SessionCreate <boolean>

このキーは、コンテキストのデフォルトセッションが属しているのではなく、ジョブが新しい​​セキュリティ監査セッションに生成されることを指定します。詳細については、auditon(2)を参照してください。

UserName <string>

このオプションのキーは、ジョブを実行するユーザーを指定します。このキーは、特権システムドメインにロードされるサービスにのみ適用されます。

GroupName <string>

このオプションのキーは、ジョブを実行するグ​​ループを指定します。このキーは、特権システムドメインにロードされるサービスにのみ適用されます。UserNameが設定され、GroupNameが設定されていない場合、グループはユーザーのプライマリグループに設定されます。

最後にコードサイン

以下を使用して署名証明書ハッシュを検索できます find-identity

security find-identity -p codesigning -v

フレームワーク、dylibなどの共同設計

/usr/bin/codesign --verbose=4 -f -s "$SIGNER_HASH" "$SIGNABLE"

App Bundleのコデザイン

/usr/bin/codesign --verbose=4 -f -s "$SIGNER_HASH" --entitlements entitlements.xcent "$SIGNABLE"

最後の注記-Xcodeの実行方法を見るとCODESIGN_ALLOCATE、Xcodeに含まれているものではなく、Xcodeに含まれているものを使用するように設定されています/usr/bin

export CODESIGN_ALLOCATE="$( xcrun --find codesign_allocate )"

検索パスはに設定されています${PLATFORM_PATH}:${TOOLCHAIN_PATH}:${PATH}。ここで、PLATFORMパスは特定のターゲットSDKの/ usr / binディレクトリであり、TOOLCHAIN_PATHはXcodeホストツールの/ usr / binです。


3
確かにそれについての記事を書くことができますね、私は2日以来これを探していました。私が読んだものやスタックオーバーフローの投稿の数がわかりません。どうもありがとう!
ダミアン

この役立つチュートリアルをありがとう!
Taras Nikulin

キーチェーンのACLは私にとって欠けていた部分でした。分かりやすい説明ありがとうございます!
Keuha、

11

システムのキーチェーンにキーを置く


しかし、それでもユーザー名とパスワードを尋ねる
Durai Amuthan.H

システムキーチェーンにキーを配置する方法.......キーチェーンアクセスからコピーして貼り付けますか?
Ashish Karpe 2017年

@AshishKarpeをドラッグアンドドロップ
Alistra

ドラッグアンドドロップで引き続き同じエラーが発生しました:===ビルドターゲットのPatientPortalの構成デバッグを伴うPatientPortalデバッグ===依存関係のチェック 'com.abc.xyz360'のプロファイルが見つかりませんでした:Xcodeは 'comに一致するプロビジョニングプロファイルを見つけることができませんでした.abc.xyz360 '。SDK 'iOS 10.2'の製品タイプ 'Application'にはコード署名が必要です
Ashish Karpe

マシンにプロビジョニングプロファイルがインストールされていない、つまり@AshishKarpe
Alistra

5

したがって、これが機能するコマンドです。-AMacがパスワードを要求するのを防ぐためです。system.keychainへのインポートにはGUIは必要ありません。

sudo security import <cert.p12> -k "/Library/Keychains/System.keychain" -P <passphrase> -A


3

キーホルダーがロックされました。その事実を変えること私の進歩に抵抗しました ...

Keychain Access-> Keychain First Aid-> Repairetvoilá


2

キーチェーンのロックを解除するだけでは十分ではありません。また、秘密鍵のアクセス権を「すべてのアプリにこのアイテムへのアクセスを許可する」に設定する必要があります。コマンドラインからそれを行うには、キーを再インポートする必要があります。一度に物事を行うには:

ログインキーチェーンがロックされている場合は、ロックを解除します。ただし、ロックするべきではありませんが、とにかくここでその方法を説明します。

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を構築できます。


2

(別の回答で述べたように)キーチェーンのロック解除とは別に、すべてのアプリケーションからキーチェーンのXcode認証トークンへのアクセスを許可する必要があります。

  • 「ログイン」キーチェーンを選択
  • 「すべてのアイテム」カテゴリを選択します
  • 「xcode」キーワードで検索
  • すべてのXcodeトークンに対して「すべてのアプリケーションがこのアイテムにアクセスできるようにする」を選択します
  • キーチェーンのロック解除手順を追加することを忘れないでください(以前の回答から)

スクリーンショット


1

キーをシステムキーチェーンにインポートします。次のコマンドを使用できます。

sudo security import YourKey.p12 -k /Library/Keychains/System.keychain -P PasswordToYourKey -T /usr/bin/codesign

1

だから私はここですべての答えを試してみましたが、何かがまったく足りませんでした。最後に、CIサービスを再起動すると、予想とは異なるユーザーで実行されていることがわかりました。ログインチェーンのキーに実際にアクセスできるユーザーに変更すると、すべてが修正されました。これは一般的な問題ではないかもしれませんが、他の人に起こる場合に備えて、このエラーの具体的な理由を文書化したいと考えていました。


私はまったく同じ問題を抱えていました。お返事ありがとうございます。:)
パヴェルK

0

私にとって、何もうまくいかなかったので、Xcodeを再インストールする必要があります。ジェンキンスは同じエラーを出し続けます。Xcodeのインストールをゴミ箱に移動して再インストールすれば、時間を大幅に節約できます。コマンドラインから少なくとも1回はcodesignコマンドを実行してください。

同じエラーが発生した後でも、「キーチェーンのロックを解除しますか?」Jenkins内のプロパティと、/ Users / $ {USER} /Library/Keychains/login.keychainの下にあるlogin.keychainへのパスを指定します

その後、神様があなたと共におられることを願っています。


0

私の場合、これは、デフォルトのタイムアウトが300秒で作成されたキーチェーンと、300秒以上続く長いxcodeコンパイルが原因で発生しました。私にとっての回避策は、以下を呼び出すことでした:

security set-keychain-settings -t <longer timeout in seconds> <keychain>

一時的なキーチェーンを作成した直後。


0

私はこれらすべての提案を実行しましたが、それでもfastlaneの使用に問題がありました。 gymましたが、Jenkinsの仕事でました。証明書をインストールしてキーチェーンのロックを解除しました。コマンドラインで手動でcodesignコマンドを実行すると、スレーブでコード署名を行うことができました。

回避策として、JenkinsがSSHの代わりにJNLPを使用してスレーブに接続する場合は、コード署名することができます。


0

私にとっては、手動で追加された2つ目のキーチェーンがあり、それがロックされているときに発生します。何らかの理由でcodesign、ロックされたキーチェーンへのアクセスを試み、証明書がログインキーチェーンにある(ロック解除されている)にもかかわらず失敗します。2番目のロックを解除すると、問題が解決します。私には意味がありません。


-1

上記の解決策のいくつかを試した後。私が持っている要因の1つは、IONコンソールを使用してビルドを開始していることだとわかりました。ターミナルアプリからビルドするように切り替えたところ、すべてが問題なく動作しました。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.