2009-10-20 8 views
13

Per inviare e ricevere messaggi crittografati da/verso l'iPhone ho bisogno di leggere una chiave pubblica (chiave pubblica del server) file PEM e creare un SecKeyRef (più tardi potrei persino memorizzarlo sul portachiavi per non crearlo più).iPhone: Come creare un SecKeyRef da un file di chiave pubblica (PEM)

Questo è il mio flusso di lavoro corrente:

  1. Sul server: Creare un file P12 con certificato dell'utente e la chiave privata. Memorizzare la chiave pubblica dell'utente sul portachiavi del server.
  2. Su iPhone: recuperare il file P12 dal server, utilizzare la password per aprirlo e memorizzare la chiave privata sul portachiavi.
  3. Su iPhone: recupera un file PEM con la chiave pubblica del server dal server. Creare un SecKeyRef e memorizzarlo sul portachiavi
  4. Su iPhone: utilizzare entrambi i tasti per inviare/ricevere messaggi crittografati al/dal server.
  5. Vivere felici e contenti.

Ho problemi con 3, poiché non riesco a creare un SecKeyRef dai dati del file PEM. Non riesco a trovare alcuna documentazione su come farlo, Qualcuno ha avuto lo stesso problema? Qualche suggerimento? Dato che non riesco a trovare esempi di codice o documentazione su questo, sento che sto facendo qualcosa di sbagliato ...

grazie!

+0

Potete dirmi come posso memorizzare e recuperare le chiavi? Come fare riferimento alle chiavi memorizzate nel portachiavi? Ho quasi lo stesso scenario come te. Voglio generare la coppia di chiavi in ​​iPhone e archiviare nel portachiavi. Poi più tardi lo vogliamo recuperare. So come generare ma non riesco a memorizzare e recuperare con successo dal portachiavi. – karim

risposta

7

Dovresti essere in grado di interpretare un pem codificato DER e ottenere un certificato utilizzando SecCertificateCreateWithData() da cui estrarre una chiave;

NSData *myCertData = ....; 

SecCertificateRef cert = SecCertificateCreateWithData (kCFAllocatorDefault, myCertData); 
CFArrayRef certs = CFArrayCreate(kCFAllocatorDefault, (const void **) &cert, 1, NULL); 

SecTrustRef trust; 
SecTrustCreateWithCertificates(certs, policy, &trust); 
SecTrustResultType trustResult; 
SecTrustEvaluate(trust, &trustResult); 
SecKeyRef pub_key_leaf = SecTrustCopyPublicKey(trust); 
+1

Grazie! Sai quali chiavi/valori dovrei usare per memorizzare/recuperare questa chiave dal portachiavi usando SecItemAdd/SecItemCopyMatching? – TehJabbit

+3

Come si crea un oggetto della politica? lo snippet di codice non menziona nulla sulla politica? – futureelite7

+2

Come abbiamo ottenuto questo myCertData? Supponiamo di avere un file pub.pem generato dal comando openssl, quindi devo usare questo codice: NSData * myCertData = [[NSData alloc] initWithContentsOfFile: @ "public.pem"]; ? – Devarshi