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

자동화 된 빌드는 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이 수행하는 작업을 수행하는 명령 줄 방법이 있습니까?



답변

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

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

액세스 제어 탭


답변

글쎄, 나는 오늘 내 자신의 질문에 대답 할 것 같아요. 왜냐하면 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"


답변

다른 답변들 중 어느 것도 나를 위해 일하지 않았습니다.

결국 나를 구한 것은 이 게시물 이었습니다.

요약하자면, 기본 시간 초과 인 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>


답변

보안을 사용하여 / 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입니다.


답변

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


답변

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

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