Безопасность / кодировка в Sierra: связка ключей игнорирует настройки контроля доступа и запросы интерфейса для разрешения

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

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

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

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

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

9 ответов

Решение

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

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

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

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

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

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

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

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

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

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

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

Затем я смог загрузить новый файл цепочки для ключей на мой сервер сборки Jenkins, где он был разблокирован плагином Keychains и Provisioning Profiles. Сборка теперь успешно подписывается.

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

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

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

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

Пару дней я искал решение. Это не помогло

security import ${P12_FILE} -k ${KEYCHAIN_PATH} -P ${P12_PASSWORD} -A

но когда я перечислил приложения явно - это сработало (по крайней мере, на Каталине)!

security import ${P12_FILE} -k ${KEYCHAIN_PATH} -P ${P12_PASSWORD} -T /usr/bin/codesign -T /usr/bin/productsign

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

При импорте нового сертификата в цепочку ключей для сервера CI мы используем следующий скрипт, чтобы убедиться, что импорт прошел успешно, а код находится в списке контроля доступа:

      #!/bin/zsh
KC_FILE=keychain-path
KC_PASSWORD=keychain-password
P12_STORE=pkcs12-path
P12_PASSWORD=pkcs12-password

security unlock-keychain -p $KC_PASSWORD $KC_FILE

CERT_SHA1=`openssl pkcs12 -in $P12_STORE -nodes -passin pass:"$P12_PASSWORD" 2> /dev/null |openssl x509 -noout -fingerprint | grep Fingerprint | sed '/Fingerprint/s/^.*=//;s/://g'`

security delete-identity -Z $CERT_SHA1 $KC_FILE

security import $P12_STORE -t cert -f pkcs12 -P "$P12_PASSWORD" -T /usr/bin/codesign -k $KC_FILE

security set-key-partition-list -S apple-tool:,apple:,codesign: -s -k $KC_PASSWORD $KC_FILE

Рядом с использованием

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

Мне также пришлось изменить настройки моей связки ключей на "без тайм-аута", используемый

security set-keychain-settings keychainName

(Документация доступна на https://ss64.com/osx/security-keychain-settings.html)

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

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

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

Другие вопросы по тегам