2009-10-20 14 views
13

Para enviar y recibir mensajes cifrados desde/hacia el iPhone, necesito leer un archivo PEM de clave pública (clave pública del servidor) y crear un SecKeyRef (más tarde incluso podría almacenarlo en el llavero para no volver a crearlo).iPhone: Cómo crear un SecKeyRef desde un archivo de clave pública (PEM)

Ésta es mi flujo de trabajo actual:

  1. En el servidor: Crear un archivo P12 con el certificado del usuario y la clave privada. Almacene la clave pública del usuario en el llavero del servidor.
  2. En el iPhone: Recupere el archivo P12 del servidor, use la contraseña para abrirlo y almacene la clave privada en el llavero.
  3. En el iPhone: Recupere un archivo PEM con la clave pública del servidor del servidor. Cree un SecKeyRef y guárdelo en el llavero
  4. En el iPhone: use ambas teclas para enviar/recibir mensajes encriptados hacia/desde el servidor.
  5. Vive feliz para siempre.

Tengo problemas con 3, ya que no puedo crear un SecKeyRef a partir de los datos del archivo PEM. No encuentro ninguna documentación sobre cómo hacerlo. ¿Alguien tuvo el mismo problema? ¿Algún consejo? Como no puedo encontrar ningún ejemplo de código o documentación sobre esto, siento que estoy haciendo algo mal ...

gracias!

+0

¿Puede decirme cómo puedo almacenar y recuperar las llaves? ¿Cómo hacer referencia a las claves almacenadas en el llavero? Tengo casi el mismo escenario que tú. Quiero generar el par de claves en iPhone y almacenarlo en el llavero. Luego, más tarde, quiero recuperarlo. Sé cómo generar pero no poder almacenar y recuperar con éxito de llavero. – karim

Respuesta

7

Debe ser capaz de interpretar una pem codificada DER y obtener un certificado usando SecCertificateCreateWithData() del cual puede extraer una clave;

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

Gracias! ¿Sabes qué claves/valores debo usar para almacenar/recuperar esta clave del llavero usando SecItemAdd/SecItemCopyMatching? – TehJabbit

+3

¿Cómo creo un objeto de política? el fragmento de código no menciona nada acerca de la política? – futureelite7

+2

¿Cómo obtuvimos este myCertData? Digamos que tengo un archivo pub.pem generado desde el comando openssl, entonces debo usar este código: NSData * myCertData = [[NSData alloc] initWithContentsOfFile: @ "public.pem"]; ? – Devarshi

Cuestiones relacionadas