"Взаємодія користувача не дозволена", намагаючись підписати додаток OSX за допомогою кодового знаку


145

Наша автоматизована збірка працює на Jenkins. Сама збірка працює на рабах, причому раби виконуються через SSH.

Я отримую помилку:

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

Я намагався всі пропозиції, які я бачив до цього часу, в інших публікаціях тут:

  • Використання розблокування брелока безпеки безпосередньо перед підписанням, щоб розблокувати брелок.
  • Переміщення ключа для підписання у власну брелок.
  • Переміщення ключа підпису в брелок для входу.
  • Переміщення ключа підпису в системний брелок.
  • Ручне встановлення списку-брелок лише на брелок, який містить ключ.

У всіх випадках я отримую однакову помилку.

Намагаючись діагностувати проблему, я спробував запустити команду "розблокувати брелок безпеки" на своєму локальному терміналі і виявив, що вона фактично не розблоковує брелок - якщо я заглянув у Keychain Access, символ блокування все ще є. Це так, чи я передаю пароль у командному рядку, чи дозволяю мені запросити мене до нього. Якщо розблокувати той самий брелок за допомогою графічного інтерфейсу, мені буде запропоновано ввести пароль, а потім розблокувати його. Крім того, якщо я біжу «безпеки з замком-брелок», я зробити побачити блокування відразу після запуску команди. Це змушує мене думати, що брелок розблокування насправді не працює. Я відчуваю таку саму поведінку на 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 у startctl. Але я не будую на майстра - мій процес збирання запускається з SSH на машині для складання підлеглих. Можливо, є командний рядок способу зробити те, що запускається, коли ви запускаєте "SessionCreate"?


Як встановити пароль keychain на circleci?
Сачин Кумарам

@SachinKumaram звучить як нове життєздатне запитання?
Трейказ

Відповіді:


205

Я теж боровся з цим. Нічого не допомогло, поки я не спробував пропозицію на http://devnet.jetbrains.com/thread/311971 . Дякую попелу агравалу!

Увійдіть до свого побудового користувача через GUI та відкрийте Keychain Access. Виберіть приватний ключ для підписання, клацніть правою кнопкою миші, виберіть Отримати інформацію, перейдіть на вкладку "Контроль доступу" та виберіть "Дозволити всім програмам доступ до цього елемента".

вкладка контролю доступу


2
Ласкаво просимо. Ви також можете розглянути можливість додавання кодового знаку до списку програм внизу, а не дозволяти всім програмам, як я. Це вже є на моєму скріншоті, але я думаю, що спочатку це не було.
bmauter

3
Я мав приховати каталог / usr з apple.stackexchange.com/a/34872/6052, щоб мати змогу додати codesignдо списку "Завжди дозволяти".
Гірські кордони

24
лише зауважте, що на додаток до цього вам також потрібно зробити цілі security unlock-keychainречі
cwd

13
Крім того, можливо, ви захочете перемістити свої ключі від входу в систему, щоб вони були доступні, коли ви робите віддалену версію на вашій машині.
Крістіян

8
Хтось знає якийсь спосіб зробити це з командного рядка? Моя машина віддаленої збірки не дозволить мені робити це через обмін екраном з міркувань безпеки .
devios1

78

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

По суті, схоже, це зводиться до того, що -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"

17
Дякую. Мені вдалося це звузити. Просто спробуйте виконати таку команду безпосередньо перед спробою побудови: безпека -v unlock-keychain -p "$ KEYCHAIN_PASSWORD" "$ HOME / Library / Keychains / login.keychain"
pir800

3
Тож немає способу отримати доступ codesignчерез ssh без фактичного зберігання пароля для входу в якийсь сценарій?
чакрит

2
@chakrit у наведеному вище прикладі я передаю лише пароль брелока, а не пароль для входу. Я розумію, що для багатьох користувачів брелок для входу - єдиний брелок, але в нашому випадку ми зберігаємо ключі підписання в окремому сховищі ключів, щоб полегшити їх синхронізацію для створення машин. Але так, багато цього матеріалу здається досить незручним для автоматизованих збірок, що змушує мене замислитися, чи Apple навіть не робить автоматизовані побудови.
Трежказ

@Trejkaz ой гаразд, принаймні, поділитися паролем брелока не так вже й погано.
чакрит

У моєму випадку використання автоматизованих віддалених збірок, зберігання пароля брелока до .envфайлу не так вже й погано, оскільки .envфайл вже містить чутливі клавіші, наприклад. AWS та Heroku. У нашому випадку облікові дані коду, пов'язані зі збіркою, зберігаються в новоствореному брелоку, який потім видаляється після збірки. Потім він відтворюється знову для наступної збірки. Однак loginбрелок потрібно все-таки відкрити, як це security unlock-keychain -p pass login.keychainбуло відсутнім посиланням тут. Дякую!
Petrus Repo

19

Жодна з інших відповідей не працювала на мене.

Що в підсумку врятувало мене - це повідомлення

Підсумовуючи це, це може бути викликано тимчасовим затримкою в 5 хвилин, що призведе до цієї помилки після тривалої збірки.

Виправити:

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

2
В El Capitan це можна зробити і через користувальницький інтерфейс. Просто відкрийте додаток для брелоків, клацніть правою кнопкою миші на вашому брелоку (логін, система тощо) та натисніть на щось, що відповідає "змінити налаштування для <Вашого_кейч>>" найкращого.
rubybeginner

Це завжди встановлює доступ до мого системного брелока Confirmнавіть після того, як я зміню доступ. : /
Алекс Заватоне

Це було мені корисно !!
Норі

Я боровся з цим 2 дні, перш ніж я знайшов ваш коментар, дякую !!!
Гілад Новік

16

Спробуйте зателефонувати security unlock-keychainі codesignяк однорядкова команда. Це мені допомогло. Щось на зразок:

security unlock-keychain -p <password> /Users/<user>/Library/Keychains/login.keychain && codesign --force --verify --verbose --sign "<certificate id>" <app name>

4
Це те саме, що робити це у двох рядках. Я думаю, різниця полягає в тому, що якщо перша команда не вдасться, вона не запустить другу.
Трейказ

1
Для мене вони не однакові. Я дзвоню їм через мурашник sshexecі кожен раз, коли він створює новий сеанс ssh.
ЖекаКозлов

2
Ви також можете виконати більше одного рядка через один сеанс ssh, якщо дуже хочете. Отже ... це все одно, окрім лікування помилок.
Трежказ

13

Використання безпеки для створення брелка для / usr / bin / codeign

Імпортувати сертифікат і його програмувати з програмним кодом програмно - це не питання використання входу в систему або системних брелоків або молитви до якогось бога кодового знаку. Вам просто потрібно встановити правильні дозволи. Я рекомендую створити новий брелок спеціально для цілей кодування.

У ці дні, щоб 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}"

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

Імпортуйте сертифікати для підписання з .p12

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

Імпорт certs і надає 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, Jenkins тощо

Одна важлива річ для будь-якого бігуна або системи побудови типу CI - це переконатися, що процес запускається launchdправильно. Переконайтеся, що ваш список містить <SessionCreate> </true>.

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

Це з launchd.plistдовідкової сторінки:

SessionCreate <boolean>

Цей ключ визначає, що завдання повинно бути породжене на новий сеанс аудиту безпеки, а не сеансу за замовчуванням для контексту. Докладніше див. Аудиторію (2).

UserName <string>

Цей додатковий ключ визначає користувача, як виконати завдання як. Цей ключ застосовується лише для служб, завантажених у привілейований системний домен.

GroupName <string>

Цей необов'язковий ключ визначає групу для виконання завдання як. Цей ключ застосовується лише для служб, завантажених у привілейований системний домен. Якщо UserName встановлений, а GroupName - ні, то група буде встановлена ​​на основну групу користувача.

Нарешті кодовий знак

Ви можете знайти хеш сертифікатів для підписання за допомогою find-identity

security find-identity -p codesigning -v

Codesign frame, 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.


3
Чувак, ти можеш остаточно написати статтю про це, я шукав це вже 2 дні. Я не знаю, скільки матеріалів та публікацій stackoverflow я прочитав. Велике спасибі вам!
Демієн

Дякуємо за це корисне проходження!
Тарас Нікулін

ACL на брелок був для мене відсутністю. дякую за чітке пояснення, сер!
Кеуха

11

Покладіть свої ключі в системну брелок


Але він все одно запитує ім'я користувача та пароль
Дурай Амутхан. H

Як поставити ключі в системний брелок ....... буде копіювати пасту з роботи доступу до брелка?
Ashish Karpe

Перетягніть @AshishKarpe
Alistra

Чи перетягування все-таки отримує однакову помилку: === БУДІВНИЙ ЦІЛЬ PatientPortal ПРОЕКТУ PatientPortal З КОНФІГУРАЦІЮ Налагодження === Перевірте залежності Не знайдено профілів для 'com.abc.xyz360': Xcode не міг знайти профіль резервування, що відповідає 'com .abc.xyz360 '. Підписання коду потрібно для типу продукту "Застосування" в SDK "iOS 10.2"
Ashish Karpe

Там сказано, що у вас не встановлений профіль резервування на машині, не те, що вам не вистачає ключів @AshishKarpe
Alistra

5

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

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


3

Моя брелок була заблокована. Він чинив опір моїм досягненням, щоб змінити цей факт ...

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


2

Розблокування брелока недостатньо. Вам також потрібно встановити доступ приватного ключа на "Дозволити всім програмам доступ до цього елемента". А для цього з командного рядка потрібно повторно імпортувати ключ. Отже, щоб приймати речі за один раз:

Розблокуйте брелок для входу, якщо він заблокований. Це не повинно бути заблокованим, але все одно ось як це зробити:

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. Зауважте, що вам не потрібно судо для всього цього ...

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

Параметр -A - це те, що дозволить вашому приватному ключу встановити значення "Дозволити всім програмам доступ до цього елемента"

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


2

Окрім розблокування брелока (як згадується в інших відповідях), потрібно дозволити доступ з усіх програм до маркера аутентифікації Xcode у брелоку:

  • Виберіть брелок для входу
  • Виберіть категорію "Усі товари"
  • Пошук за ключовим словом "xcode"
  • Виберіть "Дозволити всім програмам доступ до цього елемента" для всіх маркерів Xcode
  • Не забудьте додати крок брелока розблокування (з попередніх відповідей)

Знімок екрана


1

Імпортуйте свої ключі в системний брелок. Ви можете використовувати цю команду:

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

1

Тому я спробував кожну відповідь тут, і щось було не зовсім складання. Нарешті я зрозумів, що коли я перезавантажив службу CI, вона працює під іншим користувачем, ніж я очікував. Зміни до користувача, який фактично мав доступ до ключа в ланцюзі входу, виправили все. Це може бути не поширеною проблемою, але я хотів задокументувати мою конкретну причину цієї помилки, якщо вона трапиться з іншими.


У мене була точно така ж проблема. Спасибі за вашу відповідь. :)
Paweł K

0

Мені здається, що нічого не вийшло, потрібно знову встановити Xcode. Дженкінс продовжує давати ту саму помилку. Ви б заощадили багато часу, якщо просто перемістити інсталяцію Xcode у кошик та перевстановити. Переконайтеся, що ви запустили команду codeign з командного рядка принаймні один раз.

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

Я сподіваюся, що Бог буде з вами після цього.


0

У моєму випадку це було спричинено тим, що створений брелок із затримкою за замовчуванням 300s та довгим компіляцією xcode тривалістю понад 300s. Для мене вирішенням цього завдання було:

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

відразу після створення тимчасового брелка.


0

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

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


0

Для мене це відбувається, коли вручну додається другий брелок, і він заблокований. Чомусь codesignнамагається отримати доступ до заблокованої брелок брелоків і не вдається, навіть якщо сертифікати знаходяться в брелоку входу (і розблоковані). Розблокування другого вирішує проблему. Просто для мене немає сенсу.


-1

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.