program tip

분기 된 터미널에서 xcodebuild 실행

radiobox 2020. 12. 10. 19:48
반응형

분기 된 터미널에서 xcodebuild 실행


iPhone 애플리케이션을위한 자동화 된 빌드 서버를 설정하려고합니다. 테스터가 개발 과정을 따를 수 있도록 야간 임시 베타 빌드를 만들고 싶습니다.

adhoc 빌드를 수행하기 위해 xcode를 성공적으로 설정했으며 명령 줄에서 빌드를 시작할 수도 있습니다.

xcodebuild -configuration AdHoc -sdk iphoneos2.2 클린 빌드

내가 가진 문제는 다음 줄이 분기 된 터미널 (nohup 또는 화면 사용)에서 작동하지 않고 다음과 함께 실패한다는 것입니다.

CodeSign 오류 : 코드 서명 ID 'iPhone 배포 : XXXXX'가 키 체인의 코드 서명 인증서와 일치하지 않습니다. 키 체인에 추가되면 파일을 터치하거나 프로젝트를 정리하여 계속합니다.

셸과 nohup 또는 화면에서 환경 변수를 확인했지만 단서를 찾지 못했습니다. 내 문제는 분기 된 터미널이 키 체인에 액세스 할 수 없지만 허용 방법에 대한 단서가 없다는 것입니다.

당신의 도움을 주셔서 감사합니다


나는 테 오류 한 사용자 상호 작용이 허용되지 않습니다 먼저 키 체인 잠금을 해제하여 해결

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

나는 또한 시스템의 키 체인에 내 인증서를 넣으려고 시도했고 작동했습니다. 마지막 해결책은 Keychain Access 응용 프로그램을 사용하여 iPhone.keychain이라는 전용 키 체인에 모든 iPhone 관련 인증서를 넣는 것입니다.

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

여기에는 두 가지 (아마도 세 가지!) 구성 요소가 있습니다. 하나는 키 체인이 잠금 해제되어야한다는 것입니다. 둘째, 잠금 해제 상태의 응용 프로그램에 부여 된 권한을 알려주는 액세스 제어 목록이 키 체인 내부에 있습니다. 따라서 키 체인이 성공적으로 잠금 해제 된 경우에도 개인 키에 액세스하고이를 사용하여 서명 할 수있는 기능이 제공되지 않으면 /usr/bin/codesign이 메시지가 계속 표시됩니다. 마지막으로 Mac OS Sierra를 사용하는 경우 codesign바이너리 와 호환되도록 키에 할당 된 기본 파티션 ID가 올바르지 않습니다 .

해결책은 다음과 같습니다.

1) 키 체인 액세스 GUI에 액세스 할 수있는 경우 개인 키를 마우스 오른쪽 버튼으로 클릭하고 "액세스 제어"탭을 선택한 다음 "모든 애플리케이션 허용"을 선택하여 모든 프로그램 또는 / usr / bin / codesign 액세스 권한을 수동으로 부여 할 수 있습니다. 이 항목에 액세스하려면 "라디오 또는"이 응용 프로그램의 액세스를 항상 허용 "목록의 목록을 참조하십시오.

2)이 오류가 발생하면 codesign로그인하지 않은 사용자를 위해 실행하려고 할 가능성이 있습니다 . 이 경우 "키 체인 액세스"GUI에 대한 액세스 권한이 분명히 없습니다. 이러한 경우에는 모든 애플리케이션을 의미하는 application에 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파티션 ID를 수정 합니다. 아마도 이것은 codesignApple에서 배포했기 때문에 할당 된 네임 스페이스 입니다.

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

참고 : apple-tool파티션은 security도구 에 의해 삽입 되므로 위의 명령은 해당 파티션을 유지합니다. 이 측면에 대한 자세한 내용은 http://www.openradar.me/28524119를 참조하십시오.


또 다른 해결책 :

  • 키 체인 접근 열기
  • 개인 키를 마우스 오른쪽 버튼으로 클릭하십시오.
  • "정보 입수"를 선택하십시오
  • "액세스 제어"탭을 선택합니다.
  • "모든 응용 프로그램이이 항목에 액세스하도록 허용"을 클릭합니다.
  • "변경 사항 저장"을 클릭하십시오.
  • 비밀번호를 입력하세요
  • 즐겨

당신이 사용할 수있는 security list-keychains -s ${HOME}/Library/Keychains/login.keychain명시 적으로 검색 목록에 로그인 키 체인을 추가하는 빌드 프로세스 내부에? 분기 된 터미널에서 나온 것처럼 보이지만 빌드 프로세스는 사용자 키 체인을 보지 못합니다. 키 체인 검색 목록이 현재 보안 세션을 기반으로하는 경우 의미가있을 수 있습니다. 분기 된 터미널 세션은 마치 ssh루프백 연결 통해 로그인 세션을 떠날 것 입니다.


좋아, 문제는 나에게 두 가지였다. 첫 번째는 키 체인을 여는 것이었다.

security unlock-keychain login.keychain

두 번째는 (빈) 암호였습니다.

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

업데이트 : A는 나중에 스크립트가 웹 스크립트 또는 sth에서 트리거 될 때 약간의 문제가있었습니다. 그렇게. /Library/Keychains/System.chain 만 표시됩니다. 그래서 나는 더러운 해결 방법을 찾았습니다 (보안 문제로 이어질 수 있지만 나에게는 괜찮습니다).

  • 내 경우에는 pubkey ssh 로그인 설정 (빌드 스크립트를 호출하려는 사용자, 인증서가 있고 xcodebuild를 실행할 실제 사용자)는 동일한 사용자입니다. Apache가 작동 중이며 someuser빌드를위한 모든 것이 someuser.
  • 그리고 내 PHP 스크립트 (빌드 트리거 용)는 ~ / build-script를 호출했습니다. 다음과 같이 변경했습니다.

    ssh someuser @ localhost ~ / 빌드 스크립트

따라서 실제 tty에서 작동하고 모든 키 체인에 액세스 할 수 있으며 모든 것이 잘 작동합니다.


Jenkins와 유사한 문제가 발생하는 사람들을위한 업데이트 :

LaunchDaemons를 통해 젠킨스를 실행하도록 Mac을 설정 한 경우 다음을 추가해야합니다.

<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

I think the issue is that for my setup (and possibly for yours too), you're running in a different security preference domain (system vs. user). Finally -- here is how I got my sysiphone.keychain to show up:

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

... and magically things started to build in Jenkins. Wow... that was about 4 hours down the drain for me. Sigh.


As another poster says,

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

But I think you only have access to the login.keychain when you are logged in, in the GUI context (I just tested on a system via SSH and screen, but which I also happen to be logged into via VNC).

It is apparently possible to use launchctl to select the GUI context and run the program, but I suspect that only works for the "logged in user" too.

If you try 'security show-keychain-info keychain-file' then you'll get the following error:

User interaction is not allowed

And that's a phrase to search with for some more info. The other solution is to put the certificate into your System keychain!


I've looked at the security command an it appears that the keychains assigned to my terminal are not the same when forked. If I launched the security command in terminal I have:

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

whereas when using screen I have the following output:

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

Since my build certificates are stored in the login keychain, the code sign error I have looks normal.

Does anyone know how I could assign a keychain to a terminal? I've tried this without success

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

Any ideas?


I am using Atlassian Bamboo 2.7 and OS X 10.7.3 Lion and I've tried every approach found in the thread but I was still getting the "user interaction not allowed" error.

The problem was that, in a remote terminal session (as "superuser" such as in the case of Bamboo or another automated build system), the keychain that needs to be unlocked containing the signing certificates are different from what you would normal see (such as was shown by Yann in here) when you are not superuser.

What ultimately worked for me was to do the following:

  1. log in as System Administrator as described here
  2. create the signing-only keychain (e.g., ios.keychain)
  3. add the signing certificates to it (along with the WWDRCA certificate)

Verify it by going su and running security list-keychains on the terminal. You should see the ios.keychain among the list. (sudo security list-keychains won't show the same thing):

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

I've found that you still have to add ios.keychain to your search scope before doing the unlock-keychain command. In your build script, have the following lines run:

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

Unlocking the login keychain did not work for me. Creating a separate keychain using Keychain Access (called iOS) and then adding these commands to the build did work (when running Jenkins as my own user):

security -v list-keychains -d system -s ~/Library/Keychains/iOS.keychain; security -v unlock-keychain -p password ~/Library/Keychains/iOS.keychain;

This looks more promising, though: https://wiki.jenkins-ci.org/display/JENKINS/Xcode+Plugin#XcodePlugin-Userinteractionisnotallowed


If you're running security list-keychains and seeing your custom keychain appear SOMEWHERE in the list but it still doesn't work, it could be that you're running into the issue I had whereby the keychains are checked in order from the search list, and since I wasn't unlocking login.keychain in my SSH session, it would fail there rather than move to the next keychain in the list, which was the custom one I wanted to unlock.

Setting the search list to a custom keychain which you unlock with security unlock-keychain works. Using this method from Yann's answer will also remove your login.keychain from the search list.

To preserve login.keychain:

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

This way, when using the GUI session at the machine you will still have access to login.keychain items, but code signing will check the custom keychain first, which succeeds if you've unlocked it.


If you're executing xcodebuild as root (which you are when you sudo), you need to log in as root and put your signing certificates in root's keychain. Then unlock the keychain with security as above.


I did:

  • delete login.keychain from list

  • create own keychain in $HOME/Library/Keychains/

  • add it to keychain list (I did not specify any specific domain)

  • set it as default

  • call security unlock-keychain on it

  • add global signing certificate (WWDRCA) to it

  • import private key and both Development and Distribution certificates to it

If there's login.keychain, I still get "User interaction not allowed" error. Thus deleting login.keychain using security delete-keychain finally helped!

참고URL : https://stackoverflow.com/questions/577750/running-xcodebuild-from-a-forked-terminal

반응형