Como assinar novamente o arquivo ipa?

107

Como assino o arquivo .ipa com um perfil de provisionamento depois de gerar um IPA como o seguinte com um perfil de provisionamento diferente? Gostaria de assinar o IPA com um perfil de provisionamento ad-hoc para teste beta e, em seguida, assinar novamente o IPA exato com um perfil de provisionamento de envio de aplicativo para a loja de aplicativos.

/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}"
Johnny
fonte
1
Possível duplicata de
reassinar

Respostas:

207

É realmente fácil de fazer na linha de comando. Eu tinha a essência de um script para fazer isso. Agora ele foi incorporado ao script ipa_sign em https://github.com/RichardBronosky/ota-tools, que uso diariamente. Se você tiver alguma dúvida sobre como usar essas ferramentas, não hesite em perguntar.

O cerne disso é:

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

Seu novo aplicativo assinado é denominado resigned.ipa

Bruno Bronosky
fonte
31
7 votos positivos e nenhuma pergunta. Acho que minha festa é bem clara.
Bruno Bronosky
4
Na verdade, é bom senhor.
Rui Peres
3
@RahmathullahMPulikkal Vejo que codifiquei erroneamente um caminho na essência. Você realmente deveria usar github.com/RichardBronosky/ota-tools/blob/master/ipa_sign em vez da essência. É o código mantido.
Bruno Bronosky,
5
Você pode receber um aviso / erro nos parâmetros --resource-rules, que estão obsoletos no OS X Yosemite (10.10), simplesmente exclua este parâmetro para resolver este problema.
ıɾuǝʞ
4
Uma pequena observação: parece que CodeResourcesagora está localizado dentro da _CodeSignaturepasta, então você só precisa remover essa pasta.
dadude999
36

Verifique iResign para uma ferramenta fácil de como fazer isso!

[editar] depois de alguma confusão, eu encontrei uma solução para a demissão por uso de chaveiro. Você pode conferir em https://gist.github.com/Weptun/5406993

Blitz
fonte
existe alguma ferramenta que pode alterar o nome de exibição junto com a id do pacote durante a desistência? Isso ajudará a ter nomes de exibição diferentes para ambientes diferentes. como App-Dev, App-QA, App-Stage etc.
Nishanth Nair
1
Sim, o floatsign.sh faz exatamente isso.
Blitz de
Trabalho. Simples e bonito.
Arjun Kalidas
13

Uma pergunta meio antiga, mas com o XCode mais recente, codesigné fácil:

$ codesign -s my_certificate example.ipa 

$ codesign -vv example.ipa
example.ipa: valid on disk
example.ipa: satisfies its Designated Requirement
BryanH
fonte
2
@Pavel Esta pergunta foi respondida quando o iOS 6.x era a versão mais recente. Desde então, tivemos dois lançamentos importantes, que obviamente mudaram muitas coisas. Você pode querer limitar suas pesquisas a respostas que visam a tecnologia atual.
BryanH 01 de
Funcionou para mim você deve substituir "my_certificate" pelo nome da chave em seu chaveiro.
Franziskus Karsunke
2
codesigncomando também é usado na resposta @BrunoBronosky. Não consigo usá-lo diretamente no arquivo "* .ipa", e a opção "-vv" sempre retorna code object is not signed at allnos arquivos que eu sei que estão assinados ...
Mariano Paniga
12

As respostas postadas aqui não funcionaram bem para mim. Eles principalmente ignoraram a assinatura de estruturas incorporadas (ou incluindo os direitos).

Aqui está o que funcionou para mim (presume-se que exista um arquivo ipa no diretório atual):

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
fonte
Comentário útil da postagem acima (Rich): stackoverflow.com/questions/5160863/…
Serzas
9

Suspiro de Fastlane fornece uma solução bastante robusta para renunciar IPAs.

Do README:

Demitir-se

Se você gerou seu ipaarquivo, mas deseja aplicar um código diferente de assinatura ao arquivo ipa, pode usar sigh resign:

fastlane sigh resign

sigh encontrará o arquivo ipa e o perfil de provisionamento para você, se eles estiverem localizados na pasta atual.

Você pode passar mais informações usando a linha de comando:

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

Ele até lidará com perfis de provisionamento para aplicativos aninhados (por exemplo, se você tiver aplicativos watchkit)

Mattliu
fonte
8

Atualizei o código de Bryan para meu Sierra iMac:

# 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
fonte
Eu obtenho o seguinte erro: entitlements.plist: tipo de blob não reconhecido (aceitando cegamente) entitlements.plist: comprimento inválido no blob de direito
Amr Angry
você pode compartilhar o conteúdo do seu arquivo de direitos?
Pierre Priot
Funcionou como um encanto!
Luis E. Prado
5
  1. Descompacte o arquivo .ipa alterando sua extensão para .zip
  2. Vá para Payload. Você encontrará o arquivo .app
  3. Clique com o botão direito no arquivo .app e clique em Mostrar conteúdo do pacote
  4. Exclua o _CodeSigned pasta
  5. Substitua o embedded.mobileprovision arquivo pelo novo perfil de provisão
  6. Vá para KeyChain Access e certifique-se de que o certificado associado ao perfil provisório está presente
  7. Execute o comando abaixo mencionado: /usr/bin/codesign -f -s "iPhone Distribution: Certificate Name" --resource-rules "Payload/Application.app/ResourceRules.plist" "Payload/Application.app"

  8. Agora compacte a pasta Payload novamente e altere a extensão .zip com .ipa

Espero que isso seja útil.

Para referência, siga o link mencionado abaixo: http://www.modelmetrics.com/tomgersic/codesign-re-signing-an-ipa-between-apple-accounts/

Dharmesh Siddhpura
fonte