"Взаимодействие с пользователем не допускается" попытка подписать приложение OSX с помощью codesign


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

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

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

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

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

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

в попытке диагностировать проблему я попытался запустить команду "security unlock-keychain" на моем локальном терминале и обнаружил, что она фактически не разблокирует брелок - если я посмотрю в Keychain Access, символ блокировки все еще там. Это дело передаю ли я пароль в командной строке или позволяю ему запрашивать меня для этого. Разблокировка той же связки ключей с помощью графического интерфейса предложит мне ввести пароль, а затем разблокировать его. Кроме того, если я запускаю "security lock-keychain", я do посмотреть ключ сразу после выполнения команды. Это заставляет меня думать, что unlock-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. Но я не строю на master - мой процесс сборки запускается из SSH на подчиненной машине сборки. Возможно, есть способ командной строки, чтобы сделать то, что launchctl делает при запуске "SessionCreate"?

16 130

16 ответов:

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

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

access control tab

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

по существу, похоже, что это сводится к -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 <password> /Users/<user>/Library/Keychains/login.keychain && codesign --force --verify --verbose --sign "<certificate id>" <app name>

положите ключи в систему брелок

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

sudo security import <cert.p12> -k "/Library/Keychains/System.keychain" -P <passphrase> -A

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

Keychain Access ->Keychain First Aid ->Repair, et voilá!

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

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

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

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

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

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

security import <cert.p12> -k "~/Library/Keychains/login.keychain" -P <passphrase> -A

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

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

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

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

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

даже после того, как вы получите ту же ошибку попробуйте установить " разблокировать брелок?'свойство в пределах Дженкинса и дать путь к вашему логину.связка ключей под /Users/${USER}/Library/Keychains / login.брелок

Я надеюсь, что Бог быть с тобой После этого.

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

security set-keychain-settings -t <longer timeout in seconds> <keychain>

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

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

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

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

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

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

импорт сертификата и его программная работа с codesign-это не вопрос использования логина или системных ключей или молитвы какому-то Богу 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}"

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

удалите значения по умолчанию из Связки ключей

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

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

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

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

импорт сертификатов и дает codesign открыть с помощью .

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

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

это требование, которое многие люди пропускают. Вы можете увидеть, что делает macOS с помощью dump-keychain. Что в случае кодирования требует apple: и apple-tool:. -s относится к подписанию сертификатов.

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

одна очень важная вещь для любого бегуна типа CI или системы сборки - это убедиться, что процесс запущен с launchd правильно. Убедитесь, что ваш plist содержит <SessionCreate> </true>.

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

это launchd.plist man-page:

SessionCreate <boolean>

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

UserName <string>

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

GroupName <string>

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

наконец-то codesign

вы можете найти хэш сертификатов подписи с помощью find-identity

security find-identity -p codesigning -v

Codesign A framework, dylib и др.

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

Codesign пакет приложений

/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}, где путь платформы является каталог /usr/bin для данной целевой SDK и TOOLCHAIN_PATH это директория /usr/bin для размещения средств разработки Xcode.

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