MacOS Sierra以降、usr/bin/codesign UIがこのIDを使用する際にアクセスを要求しない限り、コード署名IDを/ usr/bin/securityのキーチェーンにインポートできなくなりました。これにより、ビルドサーバーのパッケージスクリプトが破損します。回避策はないようです。これは、カスタムで作成されたキーチェーンだけでなく、login.keychainにも影響します。
再現手順:ターミナルで次のコマンドを実行します(インポートするには署名IDが必要です)。
security create-keychain -p test buildagent.keychain
security unlock-keychain -p test buildagent.keychain
security list-keychains -d user -s buildagent.keychain
security default-keychain -s buildagent.keychain
security import identity.p12 -k buildagent.keychain -P password -T /usr/bin/codesign
codesign -vfs '$IDENTITY' '${PRODUCT}' --keychain 'buildagent.keychain'
結果:macOSは、以前にインポートされた秘密キーにアクセスする許可を求めるUIプロンプトを表示します。
私は多くの回避策を試しましたが、何もうまくいかないようです:
IDのインポートは確実に機能します。キーチェーンアクセスアプリケーションでキーチェーンのコンテンツを表示すると、証明書とキーが表示されます。秘密鍵のアクセス制御設定も正しく構成されます(目的のコードサイン例外規則を使用)。
SierraからのUIプロンプトを回避するにはどうすればよいですか?
使用する必要があるコマンドは次のとおりです:
security set-key-partition-list -S Apple-tool:,Apple: -s -k keychainPass keychainName
このコマンドラインツールは、リストキーチェーンの変更方法と同じように機能することに注意してください。 単一の値でset-key-partition-listを実行すると、証明書のすべてのpartitionIDが上書きされます。渡された値は検証されません。
このコマンドは、特定のキーチェーンに署名(-s)できるキーのPartitionID(コンマで区切られた-Sの後の項目)を設定します。コード署名を許可する実際のpartitionIDはApple:
です。
文書化されていないためApple-tool:
が何をしているのかはわかりませんが、security import
でキーをインポートした後はそこにあったので、コマンドをコピーして貼り付ける人を壊さないようにキープします。
この変更はMac OS Sierraで導入されたものであり、文書化されていません(少なくとも文書が見つかりませんでした)。 10月16日の時点で、セキュリティのマニュアルページにはまだこのコマンドがリストされていません。
詳細については、このバグレポートを参照してください- http://www.openradar.me/28524119
Travisまたは他のCIでこの問題を抱えている人は、アプリケーションIDリストにcodesign
を追加する必要があります。
security set-key-partition-list -S Apple-tool:,Apple:,codesign: -s -k keychainPass keychainName
追伸:keychainName.keychainを使用しています(.keychain
を追加)
この回答 からのコマンドはキーチェーンのロックを解除するだけですが、現在のアプリケーションがキーを使用できるかどうかを尋ねるUIプロンプトがまだありました。
私はこのようなプロンプトを防止しました:
[キーチェーンアクセス]のキーチェーンに移動し、そこにあるすべてのキーをダブルクリックし、[アクセス制御]タブで[すべてのアプリケーションにこのアイテムへのアクセスを許可する]をオンにします。
新しいキーチェーンファイルをJenkinsビルドサーバーにアップロードし、そこで Keychains and Provisioning Profiles Plugin でロックを解除しました。ビルドが署名に成功しました。
何らかの理由でsecurity set-key-partition-list
が機能しませんでした。
キーチェーンに証明書をインポートするときに-Aオプションを使用して解決しました。
security import ${P12_FILE} -k ${KEYCHAIN_PATH} -P ${P12_PASSWORD} -A
後でsecurity set-key-partition-list
を使用する必要はありません。
このオプションにより、アプリケーションは警告なしでインポートされたキーにアクセスできます。したがって、プロンプトが表示されなくなります。キーは保護されていないため安全ではありませんが、ビルドコンテキストによっては役立つ場合があります。
さらに、キーチェーンを検索リストに追加する必要があります。
security list-keychains -s ${KEYCHAIN_PATH}
次に、キーチェーンのロックを解除する必要があります。それ以外の場合、キーチェーンパスワードを要求するプロンプトが表示されます。
security unlock-keychain -p ${KEYCHAIN_PASSWORD} ${KEYCHAIN_PATH}
最終的には、自動ロックタイムアウトを無効にする必要があります。これは、ビルドが非常に長く、キーチェーン自体が再ロックされる場合です。
security set-keychain-settings ${KEYCHAIN_PATH}
多くの異なるソリューションを試した後、私にとってうまくいったのは、単にキーチェーンのパスワードを変更することでした。