Jak ponownie podpisać plik IPA?

107

Jak podpisać plik .ipa za pomocą profilu informacyjnego po wygenerowaniu adresu IPA, takiego jak poniższy, z innym profilem informacyjnym? Chciałbym podpisać IPA za pomocą profilu aprowizacji ad hoc na potrzeby testów beta, a następnie ponownie podpisać dokładny IPA za pomocą profilu aprowizacji aplikacji dla sklepu z aplikacjami.

/usr/bin/xcrun -sdk iphoneos PackageApplication -v "${RELEASE_BUILDDIR}/${APPLICATION_NAME}.app" -o "${BUILD_HISTORY_DIR}/${APPLICATION_NAME}.ipa" --sign "${DEVELOPER_NAME}" --embed "${PROVISONING_PROFILE}"
Jasio
źródło
1
Możliwy duplikat ponownego podpisania IPA (iPhone)
InnisBrendan

Odpowiedzi:

207

To naprawdę łatwe z poziomu wiersza poleceń. Miałem zarys scenariusza, jak to zrobić. Został on teraz włączony do skryptu ipa_sign na https://github.com/RichardBronosky/ota-tools, którego używam codziennie. Jeśli masz jakiekolwiek pytania dotyczące korzystania z tych narzędzi, nie wahaj się zapytać.

Jego sedno jest następujące:

CODESIGN_ALLOCATE=`xcrun --find codesign_allocate`; export CODESIGN_ALLOCATE
IPA="/path/to/file.ipa"
PROVISION="/path/to/file.mobileprovision"
CERTIFICATE="Name of certificate: To sign with" # must be in keychain
# unzip the ipa
unzip -q "$IPA"
# remove the signature
rm -rf Payload/*.app/_CodeSignature
# replace the provision
cp "$PROVISION" Payload/*.app/embedded.mobileprovision
# sign with the new certificate (--resource-rules has been deprecated OS X Yosemite (10.10), it can safely be removed)
/usr/bin/codesign -f -s "$CERTIFICATE" Payload/*.app
# zip it back up
zip -qr resigned.ipa Payload

Twoja nowa podpisana aplikacja nosi nazwę resigned.ipa

Bruno Bronosky
źródło
31
7 głosów w górę i ani jednego pytania. Myślę, że moja walka jest po prostu taka wyraźna.
Bruno Bronosky,
4
Rzeczywiście, jest miły, panie.
Rui Peres
3
@RahmathullahMPulikkal Widzę, że błędnie zakodowałem ścieżkę w istocie. Naprawdę powinieneś używać github.com/RichardBronosky/ota-tools/blob/master/ipa_sign zamiast sedna . To utrzymywany kod.
Bruno Bronosky
5
Możesz otrzymać ostrzeżenie / błąd dotyczący parametrów --resource-rules, które zostały wycofane w systemie OS X Yosemite (10.10), po prostu usuń ten parametr, aby rozwiązać ten problem.
ıɾuǝʞ
4
Jedna mała uwaga: to wygląda CodeResourcesobecnie znajduje się wewnątrz tego _CodeSignaturefolderu, to wystarczy, aby usunąć ten folder.
dadude999
36

Sprawdź iResign, aby uzyskać proste narzędzie, jak to zrobić!

[edytuj] po kilku zabawach, znalazłem rozwiązanie, aby zrezygnować ze świadomością pęku kluczy. Możesz to sprawdzić na https://gist.github.com/Weptun/5406993

Ciężkie bombardowanie
źródło
czy jest jakieś narzędzie, które może zmienić wyświetlaną nazwę wraz z identyfikatorem pakietu podczas rezygnacji? Pomoże to mieć różne nazwy wyświetlane dla różnych środowisk. jak App-Dev, App-QA, App-Stage itp.
Nishanth Nair
1
Tak, floatsign.sh robi dokładnie to.
Blitz
Pracuje. Proste i piękne.
Arjun Kalidas
13

Trochę starego pytania, ale z najnowszym XCode, codesignjest łatwe:

$ codesign -s my_certificate example.ipa 

$ codesign -vv example.ipa
example.ipa: valid on disk
example.ipa: satisfies its Designated Requirement
BryanH
źródło
2
@Pavel Na to pytanie udzielono odpowiedzi, gdy iOS 6.x był najnowszą wersją. Od tamtej pory wydaliśmy dwa główne wydania, które oczywiście zmieniły wiele rzeczy. Możesz ograniczyć wyszukiwanie do odpowiedzi dotyczących aktualnej technologii.
BryanH
U mnie to zadziałało. musisz zamienić „my_certificate” na nazwę klucza w swoim breloczku.
Franziskus Karsunke
2
codesignPolecenie jest również używane w odpowiedzi @BrunoBronosky. Nie mogę go użyć bezpośrednio w pliku "* .ipa", a opcje "-vv" zawsze zwracają code object is not signed at allsię do plików, o których wiem, że są podpisane ...
Mariano Paniga
12

Opublikowane tutaj odpowiedzi nie do końca mi odpowiadały. Przeważnie pomijali podpisywanie wbudowanych frameworków (lub włączanie uprawnień).

Oto, co zadziałało w moim przypadku (zakłada się, że jeden plik ipa istnieje w bieżącym katalogu):

PROVISION="/path/to/file.mobileprovision"
CERTIFICATE="Name of certificate: To sign with" # must be in the keychain

unzip -q *.ipa
rm -rf Payload/*.app/_CodeSignature/

# Replace embedded provisioning profile
cp "$PROVISION" Payload/*.app/embedded.mobileprovision

# Extract entitlements from app
codesign -d --entitlements :entitlements.plist Payload/*.app/

# Re-sign embedded frameworks
codesign -f -s "$CERTIFICATE" --entitlements entitlements.plist Payload/*.app/Frameworks/*

# Re-sign the app (with entitlements)
codesign -f -s "$CERTIFICATE" --entitlements entitlements.plist Payload/*.app/

zip -qr resigned.ipa Payload

# Cleanup
rm entitlements.plist
rm -r Payload/
simonseyer
źródło
Przydatny komentarz z powyższego posta (Rich): stackoverflow.com/questions/5160863/…
Serzas
9

Westchnienie Fastlane stanowi dość solidne rozwiązanie do rezygnacji z IPA.

Z ich README:

Rezygnować

Jeśli wygenerowałeś swój ipaplik, ale chcesz zastosować inny kod do logowania do pliku ipa, możesz użyć sigh resign:

fastlane sigh resign

sigh znajdzie plik ipa i profil informacyjny, jeśli znajdują się w bieżącym folderze.

Możesz przekazać więcej informacji za pomocą wiersza poleceń:

fastlane sigh resign ./path/app.ipa --signing_identity "iPhone Distribution: Felix Krause" -p "my.mobileprovision"

Obsługuje nawet profile udostępniania dla aplikacji zagnieżdżonych (np. Jeśli masz aplikacje Watchkit)

mattliu
źródło
8

Zaktualizowałem kod Bryana dla mojego iMaca Sierra:

# this version was tested OK vith macOs Sierra 10.12.5 (16F73) on oct 0th, 2017
# original ipa file must be store in current working directory 

IPA="ipa-filename.ipa"
PROVISION="path-to.mobileprovision"
CERTIFICATE="hexadecimal-certificate-identifier" # must be in keychain
# identifier maybe retrieved by running: security find-identity -v -p codesigning

# unzip the ipa
unzip -q "$IPA"

# remove the signature
rm -rf Payload/*.app/_CodeSignature

# replace the provision
cp "$PROVISION" Payload/*.app/embedded.mobileprovision

# generate entitlements for current app
cd Payload/
codesign -d --entitlements - *.app > entitlements.plist
cd ..
mv Payload/entitlements.plist entitlements.plist

# sign with the new certificate and entitlements
/usr/bin/codesign -f -s "$CERTIFICATE" '--entitlements' 'entitlements.plist'  Payload/*.app

# zip it back up
zip -qr resigned.ipa Payload
Pierre Priot
źródło
git następujący błąd rights.plist: nierozpoznany typ obiektu blob (ślepa akceptacja) upoważnienie.plist: nieprawidłowa długość w obiekcie blob uprawnienia
Amr Angry
czy możesz udostępnić swoją zawartość pliku uprawnień?
Pierre Priot
Działał jak urok!
Luis E. Prado,
5
  1. Rozpakuj plik .ipa, zmieniając jego rozszerzenie na .zip
  2. Idź do ładunku. Znajdziesz plik .app
  3. Kliknij prawym przyciskiem myszy plik .app i kliknij Pokaż zawartość pakietu
  4. Usuń _CodeSignedfolder
  5. Zastąp embedded.mobileprovisionplik nowym profilem informacyjnym
  6. Przejdź do KeyChain Access i upewnij się, że istnieje certyfikat powiązany z profilem tymczasowym
  7. Wykonaj poniższe polecenie: /usr/bin/codesign -f -s "iPhone Distribution: Certificate Name" --resource-rules "Payload/Application.app/ResourceRules.plist" "Payload/Application.app"

  8. Teraz spakuj ponownie folder Payload i zmień rozszerzenie .zip na .ipa

Mam nadzieję, że to pomocne.

W celach informacyjnych skorzystaj z poniższego linku: http://www.modelmetrics.com/tomgersic/codesign-re-signing-an-ipa-between-apple-accounts/

Dharmesh Siddhpura
źródło