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.