web-dev-qa-db-ja.com

Sierraのセキュリティ/コードサイン:キーチェーンはアクセス制御設定と許可のUIプロンプトを無視します

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プロンプトを表示します。

私は多くの回避策を試しましたが、何もうまくいかないようです:

  • Keychain-nameを指定するときに新しい.keychain-db拡張子を使用する
  • カスタムの代わりにlogin.keychainを使用する
  • -Aを使用したp12のインポート(「インポートされたキーへのアクセスをすべてのアプリケーションに許可する」)
  • Cert und Keyを個別にインポートする(openssl pkcs12で以前にp12から抽出されている)

IDのインポートは確実に機能します。キーチェーンアクセスアプリケーションでキーチェーンのコンテンツを表示すると、証明書とキーが表示されます。秘密鍵のアクセス制御設定も正しく構成されます(目的のコードサイン例外規則を使用)。

SierraからのUIプロンプトを回避するにはどうすればよいですか?

68
Sven Driemecker

使用する必要があるコマンドは次のとおりです:

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

132
Ilian Iliev

Travisまたは他のCIでこの問題を抱えている人は、アプリケーションIDリストにcodesignを追加する必要があります。

security set-key-partition-list -S Apple-tool:,Apple:,codesign: -s -k keychainPass keychainName

追伸:keychainName.keychainを使用しています(.keychainを追加)

28
Rafael Machado

この回答 からのコマンドはキーチェーンのロックを解除するだけですが、現在のアプリケーションがキーを使用できるかどうかを尋ねるUIプロンプトがまだありました。

私はこのようなプロンプトを防止しました:

[キーチェーンアクセス]のキーチェーンに移動し、そこにあるすべてのキーをダブルクリックし、[アクセス制御]タブで[すべてのアプリケーションにこのアイテムへのアクセスを許可する]をオンにします。

enter image description here

新しいキーチェーンファイルをJenkinsビルドサーバーにアップロードし、そこで Keychains and Provisioning Profiles Plugin でロックを解除しました。ビルドが署名に成功しました。

27
Wouter

何らかの理由で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}
4
Ika

多くの異なるソリューションを試した後、私にとってうまくいったのは、単にキーチェーンのパスワードを変更することでした。

  • ファインダー>移動>ユーティリティ
  • キーチェーンアクセスユーティリティを開きます。
  • この手順を実行する必要があるかどうかわからない:キーチェーンアクセスユーティリティの左側のサイドバーで、[証明書]をクリックします。 [キーチェーン]列を見て、Apple開発者証明書がどのキーチェーンにあるかを確認します。私の場合は、「ログイン」キーチェーンにありました。
  • 前の手順からキーチェーンのパスワードを変更します。ロックされている場合は、ロックしてからロックを解除することをお勧めします。パスワードを変更するには、関連するキーチェーン(私の場合は「ログイン」)をクリックし、キーチェーンアクセスユーティリティの[編集]メニューから[パスワードの変更...]を選択します。
  • 次回Xcodeで(製品メニューの)アーカイブステップを実行したときに、最終的にキーチェーンパスワードの入力を求められ、「ログイン」キーチェーンのパスワードを入力しました。それはうまくいきました。終了すると、アプリがリストされたアーカイブ画面が表示されました。
1
arnoldbird