«Взаимодействие с пользователем не разрешено», пытаясь подписать приложение OSX с использованием кода

Наша автоматическая assembly работает на Jenkins. Сама assembly работает на подчиненных устройствах, причем подчиненные устройства выполняются через SSH.

Я получаю сообщение об ошибке:

00:03:25.113 [codesign-app] build/App.app: User interaction is not allowed. 

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

  • Использование ключа разблокировки безопасности непосредственно перед подписью, чтобы разблокировать цепочку ключей.
  • Перемещение ключа подписи в свою собственную цепочку ключей.
  • Перемещение ключа подписи в логин-логин.
  • Перемещение ключа подписи в системную цепочку ключей.
  • Ручная настройка списка-цепочек ключей только к цепочке ключей, содержащей ключ.

Во всех случаях я получаю ту же ошибку.

В попытке диагностировать проблему я попытался запустить команду «разблокировать ключ безопасности» на моем локальном терминале и обнаружил, что она фактически не разблокирует цепочку ключей – если я смотрю в Keychain Access, символ блокировки все еще существует. В этом случае я передаю пароль в командной строке или могу ли я дать ему запрос на это. Разблокировка одной и той же брелка с помощью GUI подскажет мне пароль и затем разблокирует его. Кроме того, если я запустил «lock-keychain безопасности», я вижу блокировку клавиш сразу после запуска команды. Это заставляет меня думать, что разблокировка-брелок фактически не работает. Я испытываю то же поведение на Lion (которое мы используем для подчиненных рабов) и Mavericks (которые я разрабатываю).

Затем я попытался добавить -v ко всем командам безопасности:

 list-keychains "-d" "system" "-s" "/Users/tester/.secret/App.keychain" Listing keychains to see if it was added: (( "/Library/Keychains/System.keychain" )) unlock-keychain "-p" "**PASSWORD**" "/Users/tester/.secret/App.keychain" build/App.app: User interaction is not allowed. 

Из этого, казалось бы, список-брелки – это то, что не работает. Может быть, и не работа. : /

Здесь есть аналогичный вопрос . Решение интересное – установите значение «SessionCreate» в значение true в launchctl. Но я не строил мастер – мой процесс сборки запускается с SSH на ведомой машине. Может быть, есть способ командной строки сделать то, что запускает, когда вы запускаете «SessionCreate»?

Я тоже борюсь с этим. Ничего не помогло, пока я не попробовал предложение на http://devnet.jetbrains.com/thread/311971 . Спасибо ashish agrawal!

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

вкладка управления доступом

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

По сути, похоже, что это сводится к тому, что -d system фактически не работает. Поэтому многие ответы на другие вопросы здесь, вероятно, должны быть обновлены, чтобы отразить это.

 security -v list-keychains -s "$KEYCHAIN" "$HOME/Library/Keychains/login.keychain" security list-keychains # so we can verify that it was added if it fails again security -v unlock-keychain -p "$KEYCHAIN_PASSWORD" "$KEYCHAIN" codesign --sign "$SIGNER_IDENTITY" --force --signature-size 9600 \ --resource-rules src/AppResourceRules.plist --timestamp --verbose \ "$APP" 

Ни один из других ответов не работал для меня.

Что в конечном итоге спасло меня, это сообщение

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

Исправить:

 security set-keychain-settings -t 3600 -l ~/Library/Keychains/login.keychain 

Попытайтесь вызвать security unlock-keychain и codesign в качестве однострочной команды. Это помогло мне. Что-то вроде:

 security unlock-keychain -p  /Users//Library/Keychains/login.keychain && codesign --force --verify --verbose --sign ""  

Поместите свои ключи в системный брелок

Так что это команда, которая работает. -A заключается в том, чтобы запретить Mac запрашивать пароль. Импорт в system.keychain не требует графического интерфейса.

sudo security import -k "/Library/Keychains/System.keychain" -P -A

Мой брелок был заперт. Он сопротивлялся моим успехам, чтобы изменить этот факт …

Keychain Access брелкам -> Keychain First Aid брелка -> Repair , et voilá !

Разблокировать брелок недостаточно. Вы также должны установить для доступа к закрытому ключу «Разрешить всем приложениям доступ к этому элементу». И для этого из командной строки требуется повторно импортировать ключ. Так что взять вещи за раз:

Разблокируйте брелок для входа, если он заблокирован. Он не должен быть заблокирован, но в любом случае вот как вы это делаете:

 security -v unlock-keychain -p "$KEYCHAIN_PASSWORD" "~/Library/Keychains/login.keychain" 

Если по какой-то причине ваша машина сборки заблокирована логин-логин, и вы не хотите раскрывать этот пароль в скрипте, вы должны использовать другую цепочку ключей. Вы можете создать его на месте и использовать его в предыдущей и следующей команде. Чтобы создать его на месте:

 security create-keychain -p 'temporaryPassword' MyKeychain.keychain security list-keychains -d user -s login.keychain MyKeychain.keychain 

Затем импортируйте свои сертификаты и связанные с ними секретные ключи в цепочку логина входа, используя параметр -A. Обратите внимание, что вам не нужно sudo для всего этого …

 security import  -k "~/Library/Keychains/login.keychain" -P  -A 

Параметр -A – это то, что сделает ваш секретный ключ равным «Разрешить всем приложениям доступ к этому элементу»

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

Импортируйте ключи в системную цепочку ключей. Вы можете использовать эту команду:

 sudo security import YourKey.p12 -k /Library/Keychains/System.keychain -P PasswordToYourKey -T /usr/bin/codesign 

Для меня ничего не работало, похоже, придется переустанавливать Xcode снова и снова. Дженкинс продолжает давать ту же ошибку. Вы бы сэкономили много времени, если просто переместите установку Xcode в корзину и переустановите. Убедитесь, что вы запускаете команду codeign из командной строки по крайней мере один раз.

Даже если вы получите ту же ошибку, попробуйте установить «Разблокировать брелок»? свойство в Jenkins и указать путь к вашему login.keychain под /Users/${USER}/Library/Keychains/login.keychain

Надеюсь, бог с тобой будет.

В моем случае это было вызвано созданием связки ключей с тайм-аутом по умолчанию 300 и длительным компилятором xcode, который длится более 300 секунд. Обходной путь для меня заключался в том, чтобы вызвать:

security set-keychain-settings -t

сразу после создания временной брелка.

Я просмотрел все эти предложения и все еще испытывал проблемы с gym Fastlane в задании Дженкинса. У меня был установлен сертификат, а keychain разблокирован, и он смог кодовое имя на подчиненном устройстве, когда я вручную выполнил команду codeign в командной строке.

В качестве обходного пути, если Дженкинс подключается к подчиненному, используя JNLP вместо SSH, вы сможете кодировать код.

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

Для меня это происходит, когда второй брелок добавляется вручную, и он заблокирован. По какой-то причине codesign пытается получить доступ к заблокированной цепочке ключей и не удается, даже несмотря на то, что сертификаты находятся в цепочке логина входа (и разблокированы). Разблокирование второго разрешает проблему. Для меня это не имеет смысла.

Использование безопасности для создания брелка для / usr / bin / codesign

Импортирование сертификата и его работа с программным кодом программным способом – это не вопрос использования логинов или системных ключей или молитвы богу кодов. Вам просто нужно установить правильные разрешения. Я рекомендую создать новую цепочку ключей специально для целей кодирования.

В эти дни, чтобы получить codesign чтобы не дать errSecInternalComponent вам нужно правильно установить список разделов (ACL). Я пройду шаги:

Создание брелка

 security create-keychain -p "${KEYCHAIN_PASSWORD}" "${KEYCHAIN_NAME}" 

в этот момент брелок разблокируется, но не появляется в Keychain Access .

Добавить новый брелок в список поиска

 security list-keychains -s "${KEYCHAIN_NAME}" "${OLD_KEYCHAIN_NAMES[@]}" 

Добавьте новый список ключей в список. Если вы не сначала извлечете исходный список из list-keychains у вас больше не будет login.keychain в вашем списке поиска.

Разблокировать брелок

 security unlock-keychain -p "${KEYCHAIN_PASSWORD}" "${KEYCHAIN_NAME}" 

Это избыточно, если вы создали Keychain выше, но если Keychain уже существует, это необходимо.

Удалить значения по умолчанию из брелка

 security set-keychain-settings "${TESTING_KEYCHAIN}" 

Не указывая никаких аргументов, это устанавливает тайм-аут автоматического блокировки неограниченно и удаляет автоматическую блокировку во сне.

Импортируйте свои сертификаты подписи с .p12

 security import "${DIST_CER}" -P "${CERTIFICATE_PASSWORD}" -k "${KEYCHAIN_NAME}" -T /usr/bin/codesign 

Импортируйте сертификаты и дайте доступ к кодовому имени через параметр -T .

Установите ACL на брелок

 security set-key-partition-list -S apple-tool:,apple: -s -k "${KEYCHAIN_PASSWORD}" "${KEYCHAIN_NAME}" 

Это требование, которое многие пропустили. Вы можете видеть, что делает macOS, используя брелок для ключей. Который в случае кодовой привязки требует apple: и apple-tool: -s относится к подписанию сертификатов.

Gitlab-Runner, Дженкинс и тому подобное

Одна важная вещь для любого бегуна или системы сборки CI-типа – убедиться, что процесс запущен правильно. Убедитесь, что ваш plist содержит .

Неправильное совпадение с владельцем связки ключей с процессом сборки и обеспечение создания сеанса безопасности приведет к возникновению всех видов головных болей. Диагностически вы можете ввести list-keychains и посмотреть, соответствует ли результат вашим ожиданиям.

Это с man-страницы launchd.plist :

SessionCreate

Этот ключ указывает, что задание должно быть создано в новый сеанс аудита безопасности, а не сеанс по умолчанию для контекста. Подробнее см. В разделе «Аудион» (2).

UserName

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

GroupName

Этот необязательный ключ указывает группу для запуска задания как. Этот ключ применим только для служб, которые загружаются в привилегированный системный домен. Если UserName установлено, а GroupName – нет, то группа будет установлена ​​в основную группу пользователя.

Наконец, код

Вы можете find-identity hashирование сертификатов подписи с помощью find-identity

 security find-identity -p codesigning -v 

Кодифицировать структуру, dylib и т. Д.

 /usr/bin/codesign --verbose=4 -f -s "$SIGNER_HASH" "$SIGNABLE" 

Кодирование приложения

 /usr/bin/codesign --verbose=4 -f -s "$SIGNER_HASH" --entitlements entitlements.xcent "$SIGNABLE" 

Заключительные примечания. Если вы посмотрите, как это делается Xcode, они устанавливают CODESIGN_ALLOCATE чтобы использовать тот, который содержится в Xcode, а не в /usr/bin .

 export CODESIGN_ALLOCATE="$( xcrun --find codesign_allocate )" 

Путь поиска установлен в ${PLATFORM_PATH}:${TOOLCHAIN_PATH}:${PATH} , где путь PLATFORM является каталогом / usr / bin для данного целевого SDK, а TOOLCHAIN_PATH является / usr / bin для инструментов хоста Xcode.

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

  • Форматирование ReSharper: выравнивание равных операндов
  • Проверка указателя NULL в C / C ++
  • Как получить «кодовое обозначение» gdb на OSX?
  • В чем разница между собственным кодом, машинным кодом и кодом сборки?
  • Подписывание ароматов продуктов с gradleиентом
  • Как определить неиспользуемые определения css
  • Не удается получить доступ к родительским элементам при работе с аннотациями макросов
  • Codesign API Dropbox не работает в Xcode 4.6.3: «Объект кода вообще не подписан»
  • Покрытие кода, не показывающее результаты с помощью Xcode + gcov
  • Форматирование Литеральные параметры fragmentа кода C #
  • Можете ли вы создавать представления sql / хранимую процедуру с использованием Entity Framework 4.1 Первый подход к коду
  • Давайте будем гением компьютера.