IPA 재 서명 (iPhone)


129

현재 xcodebuild를 사용하고 xcrun을 사용하여 hudson으로 모든 응용 프로그램을 문제없이 빌드합니다.

다른 사람들로부터 회사 계정 대신 (앱 스토어 또는 임시 배포 용) 엔터프라이즈 계정으로 다시 서명하고 싶은 IPA 파일 몇 개를 받았습니다.

내 문제는 앱을 사임하려고 할 때 내 장치에 설치되지 않으며 엔터프라이즈 빌드이므로 설치해야한다는 것입니다. 오류 메시지는 iTunes가 아닌 장치에 있으며 단순히 앱을 설치할 수 없음을 나타냅니다. 더 이상 정보가 제공되지 않습니다.

일부 정보를 찾았습니다 ( http://www.ketzler.de/2011/01/resign-an-iphone-app-insert-new-bundle-id-and-send-to-xcode-organizer-for- 업로드 / )

그리고 이것은 가능할 것입니다. 내가 직면하고있는 문제는 일반적인 빌드 (xcrun 사용)에서와 같이 모바일 프로비저닝 프로파일을 포함하지 않는 것이 공동 디자인 도구로 제어 할 수 있거나 xcrun으로 다시 서명 할 수 있다는 것입니다 ?

내 사임 스크립트를 사용하여 현재

  • app.ipa의 압축을 풉니 다
  • appname = $ (ls 페이로드)
  • xcrun -sdk iphoneos PackageApplication -s "$ provisioning_profile" "$ project_dir / Payload / $ appname"-o "$ project_dir / app-resigned.ipa"--sign "$ provisioning_profile"--embed "$ mobileprovision"

결과 ipa 파일을 살펴본 결과 원래 앱과 매우 유사한 것으로 보입니다. 여기서 어떤 파일을 변경해야합니까? 처음에는 _CodeSignature / CodeResources가 변경 될 것이라고 생각했지만 내용은 거의 동일하게 보입니다.

포인터는 매우 높이 평가됩니다.

답변:


211

마침내이 일을했습니다!

프로비저닝 프로파일에 장치가 추가되지 않은 앱 스토어 제출을 위해 cert1로 서명 된 IPA로 테스트되었습니다. 사내 구축을 위해 엔터프라이즈 계정 및 모바일 프로비저닝 프로파일로 서명 된 새 IPA가 생성됩니다 (모바일 프로비저닝 프로파일이 IPA에 임베드 됨).

해결책:

IPA 압축 해제

unzip Application.ipa

오래된 CodeSignature 제거

rm -r "Payload/Application.app/_CodeSignature" "Payload/Application.app/CodeResources" 2> /dev/null | true

임베디드 모바일 프로비저닝 프로파일 교체

cp "MyEnterprise.mobileprovision" "Payload/Application.app/embedded.mobileprovision"

재 서명

/usr/bin/codesign -f -s "iPhone Distribution: Certificate Name" --resource-rules "Payload/Application.app/ResourceRules.plist" "Payload/Application.app"

재 포장

zip -qr "Application.resigned.ipa" Payload

편집 : Entitlement 부분을 제거했습니다 (골목, 감사 참조)


6
우리에게 문제를 일으킨 한 가지는 Entitlements 파일이 있다면 Apple에서 제공 한 앱 ID와 일치해야한다는 것입니다. 번들 ID를 변경 했으므로 권한이 일치하지 않습니다. 앱은 실행되지만 각 실행 후에 키 체인이 지워집니다.
tjg184

5
oleb.net/blog/2011/06/code-signing-changes-in-xcode-4 에 따르면 앱 ID는 바이너리에 내장되어 있으므로 동일한 앱 ID 만 사용하여 사임 할 수 있습니다. 다른 앱 ID로 사임 할 수 없다는 것을 알고 있습니다.
Michael Baltaks

7
@ValerioSantinelli 이전 코드 서명의 인 타이틀먼트를 이월해야합니다. FWIW 푸시 알림은 자격이 없으면 작동하지 않습니다. 압축을 푼 후 : /usr/bin/codesign -d --entitlements :entitlements.plist /Payload/appname.app사임하는 동안 추가--entitlements entitlements.plist
Peter

11
공동 설계가 Yosemite에서 실패-경고 : --resource-rules는 Mac OS X> = 10.10에서 더 이상 사용되지 않습니다! Payload / Aaa.app / ResourceRules.plist : 리소스를 읽을 수 없음
Jibeex

4
경고 : --resource-rules는 Mac OS X> = 10.10에서 더 이상 사용되지 않습니다! Payload / Application.app / ResourceRules.plist : 리소스를 읽을 수 없습니다. 이 오류가 발생합니까?
megha

44

이 질문에 대한 답변은 약간 오래되었고 잠재적으로 중요한 단계가 누락되었으므로 외부 개발자로부터 앱을 설치하기위한 업데이트 된 안내서입니다.

----- iOS 앱을 사임하는 방법 -----

다른 개발자로부터 앱 (예 : MyApp.ipa)을 받고 ideviceinstaller 를 사용하여 장치에서 앱을 설치하고 실행할 수 있다고 가정합니다. 예를 들어).

새로운 서명 자산 준비

첫 번째 단계는 설치 및 실행하려는 모든 장치가 포함 된 프로비저닝 프로파일 을 얻는 것 입니다. 프로파일에 키 체인 액세스에 설치 한 인증서가 포함되어 있는지 확인하십시오 (예 : iPhone 개발자 : 일부 본문 (XXXXXXXXXX)). 앱에 포함 된 프로파일을 바꿀 수 있도록 프로파일 (MyProfile.mobileprovision)을 다운로드하십시오.

다음으로 서명에 포함 할 자격 파일을 준비하겠습니다. 터미널을 열고 다음을 실행하십시오.

$ security cms -D -i path/to/MyProfile.mobileprovision > provision.plist

프로비져닝 프로필을 설명하는 xml 파일이 생성됩니다 . 다음으로 인 타이틀먼트를 파일로 추출하려고합니다.

$ /usr/libexec/PlistBuddy -x -c 'Print :Entitlements' provision.plist > entitlements.plist

프로비저닝 프로파일 교체 및 앱 사임

.ipa 파일 로 작업하는 경우 먼저 앱의 압축을 풉니 다 ( .app 가있는 경우이 단계를 건너 뛸 수 있음).

$ unzip MyApp.ipa

귀하의 작업 디렉토리는 이제 포함 Payload/하고 Payload/MyApp.app/. 그런 다음 이전 코드 서명 파일을 제거하십시오.

$ rm -rf Payload/MyApp.app/_CodeSignature

기존 프로비저닝 프로파일 (예 : embedded.mobileprovision)을 자신의 프로파일로 바꿉니다.

$ cp path/to/MyProfile.mobileprovision Payload/MyApp.app/embedded.mobileprovision

이제 프로비저닝 프로파일에 포함 된 인증서와 이전에 작성한 entitlements.plist로 앱에 서명하십시오.

$ /usr/bin/codesign -f -s "iPhone Developer: Some Body (XXXXXXXXXX)" --entitlements entitlements.plist Payload/MyApp.app

중요 : 또한 앱에 포함 된 모든 프레임 워크를 사임해야합니다 . 에서 찾을 수 있습니다 Payload/MyApp.app/Frameworks. 앱이 Swift로 작성되었거나 추가 프레임 워크를 포함하는 경우 서명해야하며 그렇지 않으면 앱이 설치되지만 실행되지는 않습니다.

$ /usr/bin/codesign -f -s "iPhone Developer: Some Body (XXXXXXXXXX)" --entitlements entitlements.plist Payload/MyApp.app/Frameworks/*

이제 앱을 다시 압축 할 수 있습니다.

$ zip -qr MyApp-resigned.ipa Payload

끝난

Payload원래 앱 (MyApp.ipa)과 사직 버전 (MyApp-resigned.ipa)이 있으므로 디렉토리를 제거 할 수 있습니다 . 이제 프로비저닝 프로파일에 포함 된 모든 장치에 MyApp-resigned.ipa를 설치할 수 있습니다.


이 접근 방식이 배포 프로파일에도 적용됩니까? IE : 자격을 추출하고 distro.mobileprovision에서 다시 서명 할 수 있습니까?
체이스 플 로렐

@grez IPA 배포에도 적용됩니까?
LearneriOS

'엔터프라이즈'앱 IPA뿐만 아니라 @grez의 배포를 의미합니다
LearneriOS

@LearneriOS Enterprise IPA 배포에서는 작동하지 않았습니다. Sierra, Xcode 8, iOS 10을 사용하고 있습니다. 앱은 iTunes를 통해 설치되지만 설치 후 즉시 삭제됩니다.
Bryan Bryce

@PhoenixFF 나는 iTunes와 설치에 대해 잘 모르겠지만,이 같은 명령 줄에서 설치하려고 할 수 있습니다 : $ ideviceinstaller -i myapp.ipa
InnisBrendan

11

나는이 대답을 성공적으로 따랐지만 자격이 변경되었으므로 --entitlements "Payload/Application.app/Entitlements.plist"두 번째에서 마지막 진술 의 일부를 간단히 제거하고 매력처럼 작동했습니다.


이전 의견을 두 번째로 설명하겠습니다. 최신 툴킷에서이 작업을 수행하려면 권한을 제거하십시오.
Bruno Bronosky 2016 년

2
인 타이틀먼트가 없으면 내 앱이 실제로 이상하게 작동하여 로그에 표시 SecItemCopyMatching: missing entitlement합니다. 별도의 Entitlements.plist 파일이 없으므로 권한을 유지하기 위해 @LordT의 주석echo "<?xml version=\"1.0\" encoding=\"UTF-8\"?>/usr/bin/codesign -d --entitlements - temp/Payload/$APP_NAME | sed -E -e '1d'" > temp/newEntitlements 을 사용했습니다 . 먼저 자격 파일 : 을 만든 다음 서명 할 때 사용하십시오 --entitlements temp/newEntitlements.
Bulat

5

Mac OS High Sierra 및 Xcode 10에서 확인

iResign 애플리케이션을 사용하여 동일하게 구현할 수 있습니다 .

1) .ipa의 경로를 줘

2) 새로운 조항 프로파일

3) 자격 파일 (선택 사항, 자격이있는 경우에만 추가)

4) 번들 ID

5) 유통 증명서

다시 서명 한 후 출력 된 .ipa 파일이 저장된 것을 볼 수 있습니다

간단하고 강력한 도구


4

이 사임 접근법 중 어느 것도 나를 위해 일하지 않았으므로 다른 것을 해결해야했습니다.

제 경우에는 만료 된 인증서가있는 IPA가있었습니다. 앱을 재 구축 할 수는 있었지만, 동일한 인증서 (새 인증서만으로)를 배포하기를 원했기 때문에 재 구축하고 싶지 않았습니다.

다른 답변에서 언급 한 사임 방식 대신 IPcode를 만드는 Xcode의 방법을 사용했습니다.이 방법은 빌드의 .xcarchive로 시작합니다.

  1. 기존 .xcarchive를 복제하고 내용을 바꾸기 시작했습니다. (.dSYM 파일을 무시했습니다.)

  2. 압축 해제를 통해 이전 IPA 파일에서 이전 앱을 추출했습니다. 앱은 Payload 폴더에있는 유일한 것입니다.

  3. 나는이 앱을 새로운 .xcarchive로 옮겼 Products/Applications습니다.

  4. 나는 Info.plist편집했다

    • ApplicationProperties/ApplicationPath
    • ApplicationProperties/CFBundleIdentifier
    • ApplicationProperties/CFBundleShortVersionString
    • ApplicationProperties/CFBundleVersion
    • Name
  5. .xcarchive를 보통 Xcode의 보관 폴더로 옮겼습니다 /Users/xxxx/Library/Developer/Xcode/Archives.

  6. Xcode에서 Organizer 창을 열고이 새로운 아카이브를 선택하고 정기적 (이 경우 Enterprise) 내보내기를 수행했습니다.

결과는 좋은 IPA였습니다.


1
이것은 여전히 ​​Xcode 9.2에서 작동하는 천재 솔루션입니다. 필자의 경우 기존 .xcarchive 아래에서 이전 .app 파일을 복사했습니다. Info.plist를 변경하지 않았으므로 앱 버전은 이전 버전으로 유지되었지만 새 엔터프라이즈 인증서로 서명되었습니다.
dodgy_coder

3

가장 쉬운 방법은 Fastlane을 사용하는 것입니다.

sudo gem install fastlane -NV
hash -r # for bash
rehash # for zsh
fastlane sigh resign ./path/app.ipa --signing_identity "iPhone Distribution: Felix Krause" -p "my.mobileprovision"

나는 많은 방법을 시도했지만 운이 없다. 이 솔루션은 저에게 효과적이었습니다.
Omid Kia

1

Fastlane 한숨의 사임 옵션을 사용하면 매우 쉽게 할 수 있습니다.

sigh resign -p <path-to-profile-with-mobileprovision-ext> -i <code-sighning-identity-of-your-app>

명령 직전에 sigh를 사용하여 프로파일을 다운로드 할 수도 있습니다.


0

이것을 게시 해주셔서 감사합니다. 이것은 나를 위해 일했습니다. 필요한 추가 단계에 대한 메모를 추가하고 싶습니다. "Payload / Application.app /"내에 " cacert.pem " 이라는 파일을 포함하는 " CACertChains " 라는 디렉토리가있었습니다 . 이 단계를 완료하려면 디렉토리와 .pem을 제거해야했습니다. 다시 감사합니다! –


-1

확장 프로그램 및 / 또는 워치 앱이있는 앱이 있고 각 확장 / 워치 앱에 대해 여러 프로비저닝 프로파일이있는 경우이 스크립트를 사용하여 ipa 파일을 다시 서명해야합니다.

Github에서 스크립트 재 서명

이 스크립트를 사용하는 방법의 예는 다음과 같습니다.

./resign.sh YourApp.ipa "iPhone Distribution: YourCompanyOrDeveloperName" -p <path_to_provisioning_profile_for_app>.mobileprovision -p <path_to_provisioning_profile_for_watchkitextension>.mobileprovision -p <path_to_provisioning_profile_for_watchkitapp>.mobileprovision -p <path_to_provisioning_profile_for_todayextension>.mobileprovision  resignedYourApp.ipa

다른 -p 옵션을 추가하여 다른 확장 프로비저닝 프로파일도 포함 할 수 있습니다.

나를 위해-모든 프로비저닝 프로파일은 동일한 인증서 / 서명 ID로 서명되었습니다.


귀하의 링크가 손상되었습니다 ... 저자의 github를 보고이 대안을 찾았습니다. github.com/fastlane/fastlane/blob/…
jugutier

이것은 오래된 답변이며 더 이상 작동하지 않으므로 삭제해야하지만 StackOverflow에서 삭제할 수있는 방법이 없습니다.
RPM

1
이것은 우리를 위해 일했습니다. github.com/fastlane/fastlane/blob/…
jugutier

그래도 여전히 작동한다는 것을 아는 것이 좋습니다. 사람들이 의견을 읽어야 할 정도로 더 이상 원래의 답변을 편집 할 수는 없습니다 :)
RPM

fastlane sigh resign YourApp.ipa --signing_identity "iPhone Distribution: YourCompanyOrDeveloperName" -p <path_to_provisioning_profile_for_app>.mobileprovision -p <path_to_provisioning_profile_for_watchkitextension>.mobileprovision대신 사용하십시오 .
green0range
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.