Security/codesign в Sierra: Keychain игнорирует настройки контроля доступа и пользовательские подсказки для разрешения

Начиная с macOS Sierra, я больше не могу импортировать идентификатор кода в цепочку ключей с /usr/bin/security без пользовательского интерфейса usr/bin/codesign для доступа при использовании этого идентификатора. Это нарушает сценарии сборки сервера сборки. Кажется, нет обходного пути. Это касается настраиваемых цепочек ключей, но также и login.keychain.

Шаги по воспроизведению: Выполните следующие команды в терминале (для импорта необходимо наличие идентификатора подписи):

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 отображает пользовательский интерфейс, запрашивающий разрешение на доступ к ранее импортированному закрытому ключу.

Я пробовал много обходных решений, но ничего не работает:

  • Использование нового расширения .keychain-db при указании имени keychain
  • Использование имени login.keychain вместо пользовательского
  • Импорт p12 с -A ("Разрешить любому приложению получать доступ к импортированный ключ ')
  • Импортирование сертификата и ключа отдельно (извлечение от p12 до с openssl pkcs12)

Импорт идентичности определенно работает, я могу видеть сертификат и ключ при отображении содержимого брелка в приложении Keychain Access. Настройка контроля доступа для закрытого ключа также правильно настроена (с правилом исключения желаемого кода).

Как я могу избежать приглашения пользовательского интерфейса из Sierra?

Ответ 1

Команда, которую вы должны использовать, следующая:

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

Пожалуйста, имейте в виду, что этот инструмент командной строки работает как способ изменения списка ключей. Если вы выполняете список set-key-partition-list с единственным значением, он будет перезаписывать все идентификаторы разделов в сертификатах. Он не будет проверять пройденные значения.

Что делает эта команда, так это то, что она устанавливает PartitionID (элементы после -S, разделенные запятой) для ключей, которые могут подписывать (-s) для конкретной связки ключей. Фактический идентификатор раздела, который разрешает кодовое обозначение, равен apple:.

Я не знаю, что делает apple-tool:, поскольку он не документирован, но он был там после импорта ключа с помощью security import, поэтому я держу его, чтобы не ломать людей, которые копируют-вставляют команду.

Это изменение было внесено в Mac OS Sierra и не документировано (или, по крайней мере, я не смог найти документацию). По состоянию на 16 октября справочная страница по безопасности по-прежнему не перечисляет эту команду.

Для получения дополнительной информации вы можете обратиться к этому отчету об ошибке - http://www.openradar.me/28524119

Ответ 2

Для тех, у кого есть эта проблема с Travis или другим CI, вы должны добавить codesign в список идентификаторов приложения.

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

P.S: Я использую keychainName.keychain(добавление .keychain)

Ответ 3

Команда этого ответа только разблокировала брелок для меня, но у меня все еще было приглашение пользовательского интерфейса, спрашивающее, может ли текущее приложение использовать ключ.

Я запретил запрос вроде этого:

Перейдите к цепочке ключей в Keychain Access, дважды щелкните по всем клавишам и на вкладке Access Control установите флажок "Разрешить всем приложениям доступ к этому элементу".

введите описание изображения здесь

Мне удалось загрузить новый файл keychain, а затем на мой сервер сборки Jenkins, где он разблокирован

Ответ 4

По какой-то причине 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}

Затем брелок должен быть разблокирован. В противном случае будет отображаться запрос с запросом пароля keychain:

security unlock-keychain -p ${KEYCHAIN_PASSWORD} ${KEYCHAIN_PATH}

В конце концов тайм-аут автоматической блокировки должен быть отключен. Это в случае, если сборка довольно длинная и брелок снова блокируется:

security set-keychain-settings ${KEYCHAIN_PATH}

Ответ 5

Попробовав много разных решений, то, что сработало для меня, просто изменило пароль моей брелка.

  • Finder> Go> Утилиты
  • Откройте утилиту Keychain Access.
  • Не уверен, что мне нужно сделать этот шаг: на левой боковой панели утилиты Keychain Access нажмите "Мои сертификаты". Посмотрите на столбец Keychain, чтобы подтвердить, в какой Keychain есть сертификат разработчика Apple. В моем случае это было в цепочке ключей входа в систему.
  • Измените пароль для связки ключей с предыдущего шага. Возможно, вам захочется заблокировать его, а затем разблокировать, если он заблокирован. Вы меняете пароль, нажимая на соответствующую цепочку ключей ("login", в моем случае), а затем выберите "Изменить пароль..." в меню "Правка" утилиты Keychain Access.
  • В следующий раз, когда я запустил шаг архива в Xcode (в меню Product), мне в итоге было предложено ввести пароль для ключей и я ввел пароль для моего "логина". Тогда это сработало. Когда он закончил, я увидел экран Архивы с моим приложением, перечисленным в нем.

Ответ 6

Кроме того, если ваше приложение было создано более 5 минут, вы можете запустить таймер блокировки цепочки ключей и получить ошибку -1 = ffffffff. Поэтому отключите блокировку keychain как решение tmp.