2009-02-23 2 views
58

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

Я выставиться Xcode успешно Xcode для выполнения АПЧРК строит, и я также запустить сборку из командной строки:

xcodebuild -configuration AdHoc -sdk iphoneos2.2 clean build

Проблема у меня в том, что следующая строка не работает с раздвоенным терминала (с использованием поЬира или экрана) и не со следующего

CodeSign error: Code Signing Identity 'iPhone Distribution: XXXXX' does not match any code-signing certificate in your keychain. Once added to the keychain, touch a file or clean the project to continue.

Я проверил свои переменные окружения в моей оболочке и в поЬир или экране и не нашел ключ. Я думаю, моя проблема в том, что разветвленный терминал не может получить доступ к цепочке ключей, но я не знаю, как это разрешить.

Спасибо за вашу помощь

+0

Можете ли вы вставить команду, которую используете для запуска терминала? –

+0

Первый терминал запускает открытие Terminal.app Второй с экраном –

+0

Может ли проблема быть решена с помощью sudo? – adam

ответ

2

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

$ security list-keychains 
    "/Users/yannooo/Library/Keychains/login.keychain" 
    "/Library/Keychains/System.keychain" 

в то время как при использовании экрана У меня есть следующий вывод:

$ security list-keychains 
    "/Library/Keychains/System.keychain" 
    "/Library/Keychains/System.keychain" 

Поскольку мои сборки сертификаты хранятся в регистрационной брелке, код ошибка знака Я выгляжу нормально.

Кто-нибудь знает, как я могу назначить брелок для терминала? Я пробовал это без успеха

security login-keychain -s /Users/yannooo/Library/Keychains/login.keychain 

Любые идеи?

+0

Используя приложение Keychain Access, вручную скопируйте необходимые сертификаты из ключевого слова Login в системную цепочку ключей. – brack

+0

тормоз, спасибо! Он отлично работает для меня. Но я немного боюсь - это правильная схема? спасибо –

+0

Он не работает в Lion 10.7.2 (но работает до 10.7.1) –

9

Не можете ли вы использовать security list-keychains -s ${HOME}/Library/Keychains/login.keychain внутри процесса сборки, чтобы явно добавить свой логин в список поиска? Похоже, что с разветвленного терминала процесс сборки не видит ваш брелок пользователя. Это может иметь смысл, если список поиска по ключевым словам основан на вашем текущем сеансе безопасности. Разветвленный сеанс терминала оставит сеанс входа в систему так же, как если бы вы использовали ssh по соединению с обратной связью.

+0

Спасибо большое, это сделало это. –

+0

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

4

Как говорит другой плакат,

security list-keychains -s "~/Library/Keychains/login.keychain" 

Но я думаю, что у вас есть доступ только к login.keychain, когда вы вошли в систему, в контексте GUI (я только тестирование в системе через SSH и экран, но к которому я также подключился через VNC).

По-видимому, можно использовать launchctl для выбора контекста GUI и запуска программы, но я подозреваю, что это работает только для «зарегистрированного пользователя».

Если вы пытаетесь «security show-keychain-info keychain-file», то вы получите следующее сообщение об ошибке:

User interaction is not allowed

И это фраза для поиска с для получения дополнительной некоторой информации. Другое решение - поставить сертификат в системный брелок!

+1

Вы нашли решение "как разделить" логин или любой брелок? Я имею в виду использование ssh или других способов (а не GUI) для использования Keychains. –

90

Я имел те ошибки взаимодействие пользователя не допускается и решить ее разблокировку брелки первого

security unlock-keychain /Users/yannooo/Library/Keychains/login.keychain 

Я также попытался поставить свои сертификаты в связке ключей системы и она работает. Моего окончательное решения было поставить все мои iPhone связанных сертификаты в выделенной брелке имени iPhone.keychain используя Keychain Access приложения

security list-keychains -s /Users/yannooo/Library/Keychains/iPhone.keychain 
security unlock-keychain -p keychainpassword /Users/yannooo/Library/Keychains/iPhone.keychain 
+0

Возможно, вы захотите скопировать эти комментарии в исходный вопрос, вместо того, чтобы иметь их как «ответы» –

+3

Это то, что я намеревался сделать, но было слишком долго, чтобы вписаться в комментарий. И комментарии AFAIK не могут быть отформатированы. –

+0

Это решение моей проблемы «взаимодействие с пользователем не допускается». Хороший трюк. – Jirapong

1

Если вы выполнение xcodebuild как корень (который вы, когда вы Судо) , вам необходимо войти в систему под учетной записью root и поместить ваши сертификаты подписи в цепочку ключей root. Затем разблокируйте брелок с безопасностью, как указано выше.

6

Хорошо, проблема была для меня две вещи: 1-я разблокировала брелок;

security unlock-keychain login.keychain 

Второй был (пусто) ключевая фраза,

security import blahblahbackup.p12 -k login.keychain -T /usr/bin/codesign -P "" 

UPDATE: А имел небольшую проблему позже, когда скрипт запускается из веб-скрипта или СТГ. как это. Он просто видит /Library/Keychains/System.chain. Поэтому я нашел грязное обходное решение (что может привести к проблемам безопасности, но нормально для меня);

  • setup pubkey ssh login (от пользователя, который хочет вызвать скрипт сборки, для фактического пользователя, который имеет сертификаты и будет запускать xcodebuild), в моем случае это тот же пользователь. Apache работает как someuser, и все для сборки установлено на someuser.
  • и мой скрипт php (для запуска сборки) вызывали скрипт ~/build-script. Я изменил это так:

    SSH someuser @ локальный ~/встроенный скрипт

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

6

обновление для людей, работающих в подобных вопросах с Дженкинс:

Если вы настроили ваш Mac запускать Дженкинс через LaunchDaemons, вы должны убедиться, чтобы добавить

<key>SessionCreate</key> 
<true /> 

Так что все CI .plist будет выглядеть так:

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> 
<plist version="1.0"> 
<dict> 
<key>Label</key> 
<string>Jenkins</string> 
<key>UserName</key> 
<string>user</string> 
<key>GroupName</key> 
<string>staff</string> 
<key>ProgramArguments</key> 
<array> 
<string>/usr/bin/java</string> 
<string>-Xmx512m</string> 
<string>-jar</string> 
<string>/path/to/jenkins/jenkins.war</string> 
</array> 
<key>RunAtLoad</key> 
<true/> 
<key>KeepAlive</key> 
<true/> 
<key>EnvironmentVariables</key> 
    <dict> 
    <key>JENKINS_HOME</key> 
    <string>/path/to/jenkins/home</string> 
    </dict> 
<key>SessionCreate</key> 
<true /> 
</dict> 
</plist> 

Я застрял в той же проблеме, что и многие люди выше. В частности, я столкнулся с проблемой при запуске из оболочки Jenkins . Я получил то же самое ** Взаимодействие с пользователем не допускается ** ошибка. При запуске из оболочки ssh мой скрипт работал нормально.

Разница, что большинство людей также видели, что если вы запустите безопасности список-брелка вы получите:

$ security list-keychain 
    "/Library/Keychains/System.keychain" 
    "/Library/Keychains/System.keychain" 

Но при работе в SSH оболочки, я получаю:

$ security list-keychain 
    "/Users/<i>user_account_name</i>/Library/Keychains/login.keychain" 
    "/Library/Keychains/System.keychain" 

И большинство людей будут иметь все свои ключи/сертификаты и т. Д. У пользователя брелок для ключей. Как некоторые люди предположили, что легко создать новую цепочку ключей , которая отличается от ключевой цепи пользователя, и повторно отобразить ее для вашего материала для подписания XCode. Я в конечном итоге положить мину здесь: /Library/Keychains/sysiphone.keychain

Я думаю, что проблема в том, что для моей установки (и, возможно, для твоего тоже), вы работаете в другом домене привилегированной безопасности (система против пользователя). Наконец - вот как я получил sysiphone.keychain показать вверх:

$ sudo security list-keychains -d system -s "/Library/Keychains/sysiphone.keychain" 
Password: ***** 
$ security list-keychains -d system 
    "/Library/Keychains/sysiphone.keychain" 

... и волшебно вещи начали строить в Дженкинс. Ничего себе ... это было около 4 часов вниз для стока для меня. Вздох.

+0

Это исправило проблему с создателем TeamCity. Благодаря! – ddoughty

0

я сделал:

  • удалить login.keychain из списка

  • создать собственную связку ключей в $HOME/Library/Keychains/

  • добавить его в брелок список (я не указал какой-либо конкретный домен)

  • установить его по умолчанию

  • вызов security unlock-keychain на нем

  • добавить глобальный сертификат подписи (WWDRCA), чтобы он

  • импорта закрытого ключа и оба развития и распространения сертификатов на это

Если есть login.keychain, я до сих пор ошибка «Ошибка взаимодействия с пользователем». Таким образом, удаление login.keychain с помощью security delete-keychain со значением.

2

Я использую Atlassian Bamboo 2.7 и OS X 10.7.3 Лев, и я пробовал каждый подход, найденный в потоке, но я все еще получал ошибку «пользовательское взаимодействие не допускается».

Проблема заключалась в том, что в сеансе удаленного терминала (как «суперпользователь», например, в случае Bamboo или другой автоматизированной системы сборки), цепочка ключей, которая должна быть разблокирована, содержащая сертификаты подписи, отличается от того, что вы нормальный вид (например, был показан Янном в here), когда вы не являетесь суперпользователем.

Что в конечном счете работал для меня было сделать следующее:

  1. журнал в качестве системного администратора, как описано here
  2. создания подписи только для связки ключей (например, ios.keychain)
  3. добавить сертификаты подписи к нему (вместе с сертификатом WWDRCA)

Проверьте, если: su и работает security list-keychains на терминале. Вы должны увидеть ios.keychain среди списка. (sudo security list-keychains не будет показывать то же самое):

sh-3.2# security list-keychains 
"/private/var/root/Library/Keychains/login.keychain" 
"/Library/Keychains/ios.keychain" 
"/Library/Keychains/System.keychain" 

Я обнаружил, что вам все равно придется добавить ios.keychain к вашей области поиска перед выполнением команды unlock-keychain. В сценарии сборки, имеют следующие строки запуска:

KEYCHAIN=/Library/Keychains/ios.keychain 
# the -s option adds $KEYCHAIN to the search scope, while the -d option adds $KEYCHAIN to the system domain; both are needed 
security -v list-keychains -d system -s $KEYCHAIN 
security -v unlock-keychain -p bambooiphone $KEYCHAIN 
11

Другое решение:

  • Открыть Keychain Access
  • правой кнопкой мыши на секретного ключа
  • Выберите "Get Info"
  • Выберите вкладку «Контроль доступа»
  • Нажмите «Разрешить всем приложениям доступ к этому элементу»
  • Нажмите кнопку «Сохранить изменения»
  • Введите пароль
  • Наслаждайтесь
+0

Это то, что сработало для меня. В нашем случае мы используем Хадсон. –

+0

Это помогло мне и для нового cert/key, который я использовал в сборке TeamCity. – Taytay

28

Есть два (возможно три!) Компоненты для этого. Один - брелок должен быть разблокирован. Во-вторых, в цепочке ключей есть список управления доступом, который сообщает, какие разрешения предоставляются приложениям в незаблокированном состоянии. Таким образом, даже если у вас есть keychain успешно разблокирована, если возможность доступа к закрытому ключу и подписать с ним не предоставляется /usr/bin/codesign, тогда вы все равно получите это сообщение. Наконец, если вы находитесь на Mac OS Sierra, идентификатор раздела по умолчанию, назначенный клавишам, неверен, чтобы быть совместимым с двоичным кодом codesign.

Решение заключается в следующем:

1) Если у вас есть доступ к графическому пользовательскому интерфейсу доступа брелка, то вы можете вручную предоставить каждую программу или/USR/бен/CodeSign доступ правой кнопкой мыши на ваш личный ключ, выбрав вкладку «Контроль доступа», а затем выберите «Разрешить всем приложениям доступ к этому элементу» или список «Всегда разрешать доступ к этим приложениям».

2) Если вы столкнулись с этой ошибкой, скорее всего, вы пытаетесь запустить codesign для пользователя без входа. В этом случае у вас явно нет доступа к графическому интерфейсу «Keychain Access». В этих случаях, вы проверить sign разрешение недостающую для применения <null>, что, видимо, означает, что все приложения, или конкретно /usr/bin/codesign с помощью:

security dump-keychain -i login.keychain 

Однако, вы не можете добавлять или изменять атрибуты управления доступом в интерактивном режиме по какой-то причине - -одно удалить!Вам действительно нужно вручную удалить ключ и повторно добавить его в цепочку ключей, указав флаг -T.

security import login.keychain -P "<password>" -T /usr/bin/codesign 

Где -T определяет

-T Specify an application which may access the imported key (multiple -T options are allowed) 

3) Если вы на Mac OS Sierra, изменить идентификатор раздела включить apple раздел. Предположительно, это пространство имен, присвоенное codesign, потому что оно было распространено Apple.

security set-key-partition-list -S apple-tool:,apple: -k "<password>" login.keychain

ПРИМЕЧАНИЕ: apple-tool раздел вставляется security инструментом, поэтому команда выше сохраняет этот раздел. Для получения дополнительной информации об этом аспекте см .: http://www.openradar.me/28524119

+0

Большое спасибо! Это решило мою проблему. Я добавил/usr/bin/codesign в свой закрытый ключ. – bmauter

+0

Добавление/usr/bin/codesign к закрытому ключу - это решение для наших проблем с кодовыми именами. Это должен быть принятый ответ. Большое спасибо! – Vertigo

+0

'-T' уже не так. Вы также должны установить список разделов. http://stackoverflow.com/a/40039594/9636 (Привет, Марк!) –

2

Разблокировка брелка для входа не сработала для меня. Создание отдельной связки ключей с использованием Keychain Access (iOS), а затем добавление этих команд в сборку выполнялось (при запуске Jenkins в качестве моего собственного пользователя):

security -v list-keychains -d system -s ~/Library/Брелки/iOS.keychain; безопасность -v разблокировка-keychain -p пароль ~/Библиотека/Брелки/iOS.keychain;

Это выглядит более перспективным, хотя: https://wiki.jenkins-ci.org/display/JENKINS/Xcode+Plugin#XcodePlugin-Userinteractionisnotallowed

2

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

Настройка списка поиска на пользовательский брелок, который вы разблокируете с помощью security unlock-keychain. Используя этот метод из ответа Янна, вы также удалите свой login.keychain из списка поиска.

Чтобы сохранить login.keychain:

security list-keychains -s ~/Library/Keychains/custom.keychain ~/Library/Keychains/login.keychain 

Таким образом, при использовании графического интерфейса пользователя сеанса на машине вы все еще имеют доступ к login.keychain пунктов, но подписи кода будет проверять пользовательский брелка первый, который преуспевает, если вы разблокировали его.