2012-03-15 10 views
15

La struttura di un file .mobileprovision simile a questa:Quali sono i dati binari attorno al plist in un file di profilo di provisioning?

<!-- small binary data --> 

<?xml version="1.0" encoding="UTF-8"?> 
<!-- plist data --> 
</plist> 

<!-- large binary data --> 

Ho alcune domande per aggirare questo:

  1. Cos'è questo i dati binari?
  2. È utile?
  3. Come posso estrarre il plist da un file .mobileprovision senza cercare i limiti XML?

In particolare, considererò questa domanda come risposta (e assegnerò la taglia +100 assieme a essa) quando entrambi i punti Q1 e Q3 sopra indicati hanno una risposta.

risposta

23

Ho finalmente ricevuto la risposta da an answer to another question su SO.

Fondamentalmente il file .mobileprovision è un file XML crittografato CMS. Esso può essere decodificato utilizzando security su OS X:

security cms -D -i /path/to/profile.mobileprovision 
+0

Le informazioni ottenute da questo metodo possono anche essere ottenute semplicemente aprendo la mobileprovision in un editor di testo. dopo l'XML, c'è un blocco di dati extra che usando 'security' non decodificherà. –

+1

Lo so; questo è esattamente il motivo per cui ho fatto questa domanda. Quello che volevo era un modo programmabile/programmabile per ottenere solo l'XML e nient'altro. –

1

Il file è fondamentalmente la chiave di distribuzione pubblica + la catena di certificati pubblici Apple + i dispositivi consentiti che possono essere installati su - purché il file IPA sia firmato allo stesso modo.

La chiave è codificata nella voce plist. ei dati binari dopo il plist sono gli associati certficates pubblici: il certificato pubblico di Apple Root (scaricabile dal Apple e l'Autorità di certificazione di Apple iPhone (scaricabile tramite il portale Apple)

[Aggiornamento sulla base dei commenti]

. il vero obiettivo è quello di elaborare il certificato "nome comune" usato il mio file disposizione cellulare in modo che l'applicazione può essere ri-firmato.

All'interno del file di provisioning cellulare ApplicationIdentifierPrefix tag contiene l'ID utente certificato. Questo numero potrebbe essere utilizzato per trovare il certificato nello strumento portachiavi.

Così manualmente, sarebbero i passi:

  1. estrarre il numero ApplicationIdentifierPrefix dal file .mobileprovision
  2. Aprire l'applicazione portachiavi. Guardare attraverso ogni account di accesso/certificato per trovare quello con corrispondenti UserId

Per automatizzare il processo

  1. eseguire alcuni comandi di fantasia UNIX per estrarre l'ID
  2. corsa security find-certificate -a >a.out quindi grep per l'ID. Quindi trova il nome comune dallo stesso record.
+0

In pratica, voglio dare le dimissioni di un'app con un file di provisioning diverso. Mi stavo chiedendo se, invece di specificare esplicitamente il nome del certificato con cui dare le dimissioni, potremmo estrarre le informazioni sul certificato di firma dal nuovo profilo di provisioning stesso. Guardando il contenuto di un file .mobileprovision mi ha portato a questo. –

+0

Come estrarre solo le informazioni plist da questo file? –

+0

AFAIK non è possibile dimettersi, poiché è necessario firmare i file binari anche durante la compilazione in XCode e quindi nell'IPA finale. Sebbene in seguito sia possibile aggiungere il file XX.mobileprovisiong al pacchetto dell'app come embedded.mobileprovisioning. Quindi la tua situazione è che hai un IPA/APP binario ma non la fonte? – peterept

5

Non ho una risposta alla tua domanda iniziale, ma posso spiegare come estrarre il certificato di firma dal file .mobileprovision:

  1. La parte plist del .mobileprovision ha una chiave 'DeveloperCertificates', il cui valore è un array di NSData.
  2. Ogni NSData è un file .cer - il certificato di firma che stai cercando.

Ho uno script di shell breve per estrarre l'oggetto del certificato di firma direttamente da.file mobileprovision qui: https://gist.github.com/2147247 - lo script funziona con un solo certificato nella matrice menzionata in precedenza, che dovrebbe essere il caso comune.

Come puoi vedere nella sceneggiatura, non ho una risposta alla tua terza domanda, sto tagliando la prima riga e tutto dopo il tag di chiusura.

+0

Grazie mille. Mentre, come hai detto, non risponde alla domanda iniziale, è stato comunque molto utile - ho finalmente appreso che il certificato nella chiave "DeveloperCertificates" è un cert x509, qualcosa che avevo intenzione di chiedere su SO ;-) Grazie tu. –

2

uso

security cms -D -i /path/to/profile.mobileprovision 

se si ottiene il messaggio di errore security: SecPolicySetValue: One or more parameters passed to a function were not valid solo pipe l'errore /dev/null

security cms -D -i /path/to/profile.mobileprovision 2> /dev/null 
1

Il file è .mobileprovision a DER encoded ASN.1,

Il plista è uno dei valori memorizzati in questo messaggio ASN.1.