Безопасность / кодировка в 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.