공동 디자인을 사용하여 OSX 앱에 서명하려고하는“사용자 상호 작용이 허용되지 않습니다”


145

자동화 된 빌드는 Jenkins에서 실행됩니다. 빌드 자체는 슬레이브에서 실행되며 슬레이브는 SSH를 통해 실행됩니다.

오류가 발생합니다.

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

나는 지금까지 다른 게시물에서 본 모든 제안을 시도했습니다.

  • 서명하기 직전에 보안 잠금 해제 키 체인을 사용하여 키 체인의 잠금을 해제합니다.
  • 서명 키를 자체 키 체인으로 이동
  • 서명 키를 로그인 키 체인으로 이동
  • 서명 키를 시스템 키 체인으로 이동
  • 키가 포함 된 키 체인으로 만 목록 키 체인을 수동으로 설정

모든 경우에 동일한 오류가 발생합니다.

문제를 진단하기 위해 로컬 터미널에서 "security unlock-keychain"명령을 실행하려고 시도했지만 실제로 키 체인을 잠금 해제하지 않는 것으로 나타났습니다. 키 체인 액세스를 보면 잠금 기호가 여전히 있습니다. 이것은 명령 줄에 암호를 전달하거나 암호를 묻는 메시지를 표시하는지 여부입니다. GUI를 사용하여 동일한 키 체인을 잠금 해제하면 암호를 묻는 메시지가 표시되고 잠금이 해제됩니다. 내가 실행하는 경우 또한, 나는, "보안 잠금 - 키 체인" 즉시 명령을 실행 한 후 키 잠금을 참조하십시오. 이렇게하면 잠금 해제 키 체인이 실제로 작동하지 않는다고 생각합니다. 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.

이것으로부터,리스트 키 체인이 작동하지 않는 것 같습니다. 어쩌면 작동하지 않을 수도 있습니다. : /

여기에 비슷한 질문이 . 해결책은 흥미 롭습니다. launchctl에서 "SessionCreate"를 true로 설정하십시오. 그러나 나는 마스터를 기반으로하지 않습니다. 내 빌드 프로세스는 슬레이브 빌드 머신의 SSH에서 시작됩니다. "SessionCreate"를 실행할 때 launchctl이 수행하는 작업을 수행하는 명령 줄 방법이 있습니까?


circleci에서 키 체인 암호를 설정하는 방법은 무엇입니까?
Sachin Kumaram '

@SachinKumaram이 실행 가능한 새로운 질문처럼 들립니까?
Trejkaz

답변:


205

나도 이것과 싸우고있다. http://devnet.jetbrains.com/thread/311971 에서 제안을 시도하기 전까지는 아무것도 도움이되지 않았습니다 . 감사합니다 ashish agrawal!

GUI를 통해 빌드 사용자에 로그인하고 키 체인 액세스를여십시오. 서명 개인 키를 선택하고 마우스 오른쪽 단추를 클릭 한 후 정보 입수를 선택하고 액세스 제어 탭으로 변경 한 후 "모든 응용 프로그램이이 항목에 액세스하도록 허용"을 선택하십시오.

액세스 제어 탭


2
천만에요. 내가했던 것처럼 모든 응용 프로그램을 허용하는 대신 맨 아래의 응용 프로그램 목록에 공동 디자인을 추가하는 것을 고려할 수도 있습니다. 이미 스크린 샷에 있지만 원래는 그렇지 않은 것 같습니다.
bmauter

3
"항상 허용"목록 에 추가 하려면 apple.stackexchange.com/a/34872/6052 를 사용하여 / usr 디렉토리의 숨기기를 해제해야했습니다 codesign.
히스 국경

24
것이 바로 메모 이 외에도 사용자가 전체해야 할 security unlock-keychain너무 물건을,
CWD

13
또한 시스템 에서 원격 빌드를 수행 할 때 액세스 할 수 있도록 키를 로그인 에서 시스템 으로 이동하려고 할 수 있습니다 .
Krystian

8
누구든지 명령 줄 에서이 작업을 수행하는 방법을 알고 있습니까? 원격 빌드 시스템에서는 보안상의 이유로 화면 공유를 통해이 작업을 수행 할 수 없습니다 .
devios1

78

글쎄, 나는 오늘 내 자신의 질문에 대답 할 것 같아요. 왜냐하면 2 일 반 동안 그것을 찌른 후에 시도한 것 중 하나가 효과가 있었던 것 같습니다. 나는 지금 그것에서 뒤로 물러서 고 그것이 계속 작동하기를 희망합니다.

본질적으로 -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
감사. 나는 이것을 좁힐 수 있었다. 빌드하기 직전에 다음 명령을 실행하십시오. security -v unlock-keychain -p "$ KEYCHAIN_PASSWORD" "$ HOME / Library / Keychains / login.keychain"
pir800

3
따라서 codesign실제로 스크립트 내에 로그인 비밀번호를 저장하지 않고 ssh를 통해 액세스 할 수있는 방법이 없습니까?
chakrit

2
위의 예에서 @ chakrit은 로그인 암호가 아닌 키 체인 암호 만 전달합니다. 많은 사용자들에게 로그인 키 체인이 유일한 키 체인이라는 것을 알고 있지만, 우리는 서명 키를 별도의 키 저장소에 보관하여 기계를 빌드하기가 더 쉬워졌습니다. 그러나 그렇습니다.이 많은 것들이 자동화 된 빌드에 다소 불편 해 보이므로 Apple이 자동화 된 빌드조차도 궁금합니다.
Trejkaz

@Trejkaz 아 좋아요, 적어도 키 체인 암호를 공유하는 것은 나쁘지 않습니다.
chakrit

자동화 된 원격 빌드의 유스 케이스에서 키 체인 암호를 .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에서는 사용자 인터페이스를 통해서도 그렇게 할 수 있습니다. 키 체인 앱을 열고 키 체인 (로그인, 시스템 등)을 마우스 오른쪽 버튼으로 클릭 한 다음 '<your_keychain> 설정 변경'과 가장 일치하는 것을 클릭하십시오.
rubybeginner

이것은 액세스를 Confirm변경 한 후에도 항상 시스템 키 체인 액세스를 다시 설정 합니다. : /
Alex Zavatone

그것은 나를 위해 도움이되었다!!
Nori

나는 당신의 의견을 찾기 전에 2 일 동안 어려움을 겪었습니다. 감사합니다 !!!
Gilad Novik

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
그것은 두 줄로하는 것과 같습니다. 차이점은 첫 번째 명령이 실패하면 두 번째 명령이 실행되지 않는다는 것입니다.
Trejkaz

1
나를 위해 그들은 동일하지 않습니다. 나는 개미를 통해 그들을 호출하고 sshexec새로운 ssh 세션을 만들 때마다.
ZhekaKozlov

2
원하는 경우 단일 ssh 세션을 통해 둘 이상의 회선을 수행 할 수도 있습니다. 따라서 ... 오류 처리를 제외하고는 여전히 동일합니다.
Trejkaz

13

보안을 사용하여 / 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}"

위의 키 체인을 만든 경우에는 중복되지만 키 체인이 이미 존재하는 경우에는 필요합니다.

키 체인에서 기본값을 제거

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

인수를 지정하지 않으면 자동 잠금 시간 초과가 무제한으로 설정되고 절전시 자동 잠금이 제거됩니다.

.p12에서 서명 인증서 가져 오기

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

인증서를 가져오고 옵션을 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올바르게 시작되었는지 확인하는 것입니다. plist에 포함되어 있는지 확인하십시오 <SessionCreate> </true>.

키 체인 소유자와 빌드 프로세스를 올바르게 일치시키지 않고 보안 세션을 작성하면 모든 종류의 두통이 발생합니다. 진 단적으로 말하면 list-keychains출력이 예상과 일치하는지 소개 하고 확인할 수 있습니다 .

이것은 launchd.plist맨 페이지에서 온 것입니다.

SessionCreate <boolean>

이 키는 작업의 컨텍스트에 대한 기본 세션이 아닌 새 보안 감사 세션으로 작업을 생성하도록 지정합니다. 자세한 내용은 auditon (2)을 참조하십시오.

UserName <string>

이 선택적 키는 작업을 실행할 사용자를 지정합니다. 이 키는 권한있는 시스템 도메인에로드 된 서비스에만 적용됩니다.

GroupName <string>

이 선택적 키는 작업을 실행할 그룹을 지정합니다. 이 키는 권한있는 시스템 도메인에로드 된 서비스에만 적용됩니다. UserName이 설정되고 GroupName이 설정되지 않은 경우 그룹은 사용자의 기본 그룹으로 설정됩니다.

마지막으로 공동 디자인

다음을 사용하여 서명 인증서 해시를 조회 할 수 있습니다. 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 경로는 지정된 대상 SDK의 / usr / bin 디렉토리이고 TOOLCHAIN_PATH는 Xcode 호스트 도구의 / usr / bin입니다.


3
당신은 확실히 그것에 대해 기사를 쓸 수 있습니다, 나는 이틀부터 이것을 찾고있었습니다. 내가 읽은 물건과 스택 오버 플로우 게시물 수를 모르겠습니다. 많은 감사합니다!
Damien

이 유용한 연습에 감사드립니다!
Taras Nikulin

키 체인의 ACL은 저에게 없어진 부분이었습니다. 명확한 설명 주셔서 감사합니다 선생님!
Keuha

11

시스템 키 체인에 키를 넣습니다


그러나 여전히 사용자 이름과 비밀번호를 요구합니다
Durai Amuthan.H

시스템 키 체인에 키를 넣는 방법 ............ 키 체인 액세스 작업에서 붙여 넣기를 복사합니까?
Ashish Karpe

@AshishKarpe
Alistra을

끌어서 놓기가 여전히 같은 오류가 발생 했습니까? === 빌드 대상 환자의 프로젝트 포털 구성 환자와 함께 디버그 === 종속성 확인 'com.abc.xyz360'에 대한 프로파일을 찾을 수 없습니다 : Xcode가 'com과 일치하는 프로비저닝 프로파일을 찾을 수 없습니다. .abc.xyz360 '. SDK 'iOS 10.2'의 제품 유형 'Application'에 코드 서명이 필요합니다
Ashish Karpe

컴퓨터에 프로비저닝 프로파일이 설치되어 있지 않다는 메시지가 있지만 @AshishKarpe
Alistra

5

이것이 작동하는 명령입니다. -AMac이 암호를 묻지 않도록하는 것입니다. system.keychain으로 가져 오기에는 GUI가 필요하지 않습니다.

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


3

내 키 체인이 잠겼습니다. 그것은 저항 그 사실을 변경하는 내 발전을 ...

Keychain Access-> Keychain First Aid-> Repair, 등 짜잔 !


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 매개 변수를 사용하여 인증서 및 연관된 개인 키를 로그인 키 체인으로 가져 오십시오. 이 모든 것을 위해 sudo를 할 필요는 없습니다.

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를 다시 설치해야 할 것 같습니다. Jenkins는 계속 같은 오류를 발생시킵니다. Xcode 설치를 휴지통으로 옮기고 다시 설치하면 많은 시간을 절약 할 수 있습니다. 최소한 명령 행에서 codesign 명령을 한 번 실행하십시오.

같은 오류가 발생하더라도 '키 체인 잠금 해제?'를 설정하십시오. Jenkins 내의 속성을 찾고 /Users/${USER}/Library/Keychains/login.keychain 아래에 login.keychain의 경로를 제공하십시오

그 후 신이 당신과 함께 있기를 바랍니다.


0

필자의 경우 이것은 기본 타임 아웃이 300 초이고 긴 xcode 컴파일이 300 초 이상 지속되는 키 체인으로 인해 발생했습니다. 나를 위해 해결 방법은 다음과 같습니다.

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

임시 키 체인을 생성 한 직후


0

나는이 모든 제안을 겪었고 gymJenkins 작업에서 fastlane을 사용하는 데 여전히 문제가있었습니다 . 인증서를 설치하고 키 체인을 잠금 해제했으며 명령 줄에서 codesign 명령을 수동으로 실행할 때 슬레이브에서 공동 디자인 할 수있었습니다.

해결 방법으로 Jenkins가 SSH 대신 JNLP를 사용하여 슬레이브에 연결하면 공동 설계 할 수 있습니다.


0

나를 위해 수동으로 추가 된 두 번째 키 체인이 있고 잠겨있을 때 발생합니다. 어떤 이유로 든 codesign인증서가 로그인 키 체인에 있고 잠금 해제되어 있어도 잠긴 키 체인에 액세스하려고 시도하면 실패합니다. 두 번째 잠금을 해제하면 문제가 해결됩니다. 나에게 이해가되지 않습니다.


-1

위의 여러 가지 해결책을 시도한 후. 내가 가진 한 가지 요소는 ION Console을 사용하여 빌드를 시작한다는 것입니다. 터미널 앱에서 빌드하는 것으로 다시 전환했을 때 모든 것이 잘 작동했습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.