¿Cómo volver a firmar el archivo ipa?

107

¿Cómo firmo el archivo .ipa con un perfil de aprovisionamiento después de generar una IPA como la siguiente con un perfil de provisión diferente? Me gustaría firmar el IPA con un perfil de aprovisionamiento ad-hoc para las pruebas beta y luego volver a firmar el IPA exacto con un perfil de aprovisionamiento de envío de aplicaciones para la tienda de aplicaciones.

/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
fuente
1
Posible duplicado de Re-sign IPA (iPhone)
InnisBrendan

Respuestas:

207

Es muy fácil de hacer desde la línea de comandos. Tenía la esencia de un guión para hacer esto. Ahora se ha incorporado al script ipa_sign en https://github.com/RichardBronosky/ota-tools que uso a diario. Si tiene alguna pregunta sobre el uso de estas herramientas, no dude en preguntar.

El corazón de esto es este:

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

Su nueva aplicación firmada se llama resigned.ipa

Bruno Bronosky
fuente
31
7 votos a favor y ni una sola pregunta. Supongo que mi fiesta es así de clara.
Bruno Bronosky
4
De hecho, es amable señor.
Rui Peres
3
@RahmathullahMPulikkal Veo que había codificado erróneamente un camino en la esencia. Realmente debería usar github.com/RichardBronosky/ota-tools/blob/master/ipa_sign en lugar de la esencia. Es el código mantenido.
Bruno Bronosky
5
Es posible que reciba una advertencia / error en los parámetros --resource-rules, que han quedado obsoletos en OS X Yosemite (10.10), simplemente elimine este parámetro para resolver este problema.
ıɾuǝʞ
4
Una pequeña nota: parece que CodeResourcesahora se encuentra dentro de la _CodeSignaturecarpeta, por lo que solo necesita eliminar esa carpeta.
dadude999
36

¡Consulte iResign para obtener una herramienta sencilla sobre cómo hacer esto!

[editar] después de un poco de confusión, encontré una solución para la renuncia consciente de los llaveros. Puede consultarlo en https://gist.github.com/Weptun/5406993

Bombardeo aéreo
fuente
¿Existe alguna herramienta que pueda cambiar el nombre para mostrar junto con la identificación del paquete al renunciar? Esto ayudará a tener diferentes nombres de visualización para diferentes entornos. como App-Dev, App-QA, App-Stage, etc.
Nishanth Nair
1
Sí, floatsign.sh hace exactamente eso.
Blitz
Trabajos. Sencillo y hermoso.
Arjun Kalidas
13

Una especie de pregunta antigua, pero con el último XCode, codesignes fácil:

$ codesign -s my_certificate example.ipa 

$ codesign -vv example.ipa
example.ipa: valid on disk
example.ipa: satisfies its Designated Requirement
BryanH
fuente
2
@Pavel Esta pregunta fue respondida cuando iOS 6.x era la última versión. Desde entonces, hemos tenido dos lanzamientos importantes, que obviamente cambiaron muchas cosas. Es posible que desee limitar sus búsquedas a respuestas que se dirijan a la tecnología actual.
BryanH
Funcionó para mí. tiene que reemplazar "my_certificate" con el nombre de la clave en su cadena de claves.
Franziskus Karsunke
2
codesignEl comando también se usa en la respuesta de @BrunoBronosky. No puedo usarlo directamente en el archivo "* .ipa", y las opciones "-vv" siempre regresan code object is not signed at allen archivos que sé que están firmados ...
Mariano Paniga
12

Las respuestas publicadas aquí no funcionaron del todo para mí. Principalmente omitieron la firma de marcos integrados (o la inclusión de derechos).

Esto es lo que funcionó para mí (se supone que existe un archivo ipa en el directorio actual):

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
fuente
Comentario útil de la publicación anterior (Rich): stackoverflow.com/questions/5160863/…
Serzas
9

El suspiro de Fastlane proporciona una solución bastante sólida para renunciar a las API.

De su README:

Renunciar

Si generó su ipaarchivo pero desea aplicar una firma de código diferente en el archivo ipa, puede usar sigh resign:

fastlane sigh resign

sigh encontrará el archivo ipa y el perfil de aprovisionamiento si están ubicados en la carpeta actual.

Puede pasar más información usando la línea de comando:

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

Incluso manejará perfiles de aprovisionamiento para aplicaciones anidadas (por ejemplo, si tiene aplicaciones watchkit)

Mattliu
fuente
8

He actualizado el código de Bryan para mi 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
fuente
obtengo el siguiente error entity.plist: tipo de blob no reconocido (aceptando ciegamente) Entidades.plist: longitud no válida en el blob de derecho
Amr Angry
¿Puede compartir el contenido del archivo de derechos?
Pierre Priot
¡Trabajado como un encanto!
Luis E. Prado
5
  1. Descomprima el archivo .ipa cambiando su extensión con .zip
  2. Vaya a Carga útil. Encontrará el archivo .app
  3. Haga clic derecho en el archivo .app y haga clic en Mostrar contenido del paquete
  4. Eliminar la _CodeSignedcarpeta
  5. Reemplazar el embedded.mobileprovisionarchivo con el nuevo perfil de provisión
  6. Vaya a KeyChain Access y asegúrese de que el certificado asociado con el perfil provisional esté presente
  7. Ejecute el comando mencionado a continuación: /usr/bin/codesign -f -s "iPhone Distribution: Certificate Name" --resource-rules "Payload/Application.app/ResourceRules.plist" "Payload/Application.app"

  8. Ahora comprima la carpeta Payload nuevamente y cambie la extensión .zip con .ipa

Espero que esto sea de ayuda.

Para referencia, siga el enlace mencionado a continuación: http://www.modelmetrics.com/tomgersic/codesign-re-signing-an-ipa-between-apple-accounts/

Dharmesh Siddhpura
fuente