web-dev-qa-db-ja.com

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

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が実行していることを実行するコマンドラインの方法がありますか?

135
Trejkaz

ええと、今日は自分の質問に答えることができると思います。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"
76
Trejkaz

私もこれと戦っています。 http://devnet.jetbrains.com/thread/311971 で提案を試みるまで何も助けにならなかった。 ashish agrawalに感謝します!

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

access control tab

201
bmauter

他の答えはどれも私にとってはうまくいきませんでした。

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

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

修正するには:

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

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>
16
ZhekaKozlov

システムキーチェーンにキーを入れます

11
Alistra

セキュリティを使用して/ usr/bin/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

証明書をインポートし、-Tオプションを使用してcodesignアクセスを許可します。

キーチェーンにACLを設定します

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

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

Gitlab-Runner、Jenkinsなど

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

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

/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

5
Merlin Ran

キーチェーンがロックされました。それ抵抗その事実を変える私の進歩...

Keychain Access-> Keychain First Aid-> Repairetvoilá

3
Alex Gray

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

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

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
Radu Simionescu

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

1
Kevin DiTraglia

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

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

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

0
Maxime Viargues

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

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

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

0
Justin Randall

私にとっては、Xcodeを再インストールする必要はありませんでした。 Jenkinsは同じエラーを出し続けます。 Xcodeのインストールをゴミ箱に移動して再インストールするだけで時間を節約できます。少なくとも一度コマンドラインからcodesignコマンドを実行してください。

同じエラーが発生した場合でも、「キーチェーンのロック解除」を設定してみてください。 Jenkins内のプロパティおよび/Users/${USER}/Library/Keychains/login.keychainの下のlogin.keychainへのパスを指定します

その後、神様があなたと一緒にいることを願っています。

0
Kaushik Bhatt

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

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

0
Dan Stark

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

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

Screenshot

0