2010-01-10 14 views
19

Estoy compilando una aplicación para iphone que necesita acceder a un servicio web a través de https utilizando certificados de cliente. Si pongo el certificado del cliente (en formato pkcs12) en el paquete de la aplicación, puedo cargarlo en la aplicación y hacer la llamada https (en gran parte gracias a stackoverflow.com).Aplicación para iPhone con certs de cliente SSL

Sin embargo, necesito una manera de distribuir la aplicación sin ningún certs y dejar que el usuario proporcione su propio certificado. Pensé que simplemente haría eso instruyendo al usuario a importar el certificado en los perfiles de iphone (configuración-> general-> perfiles), que es lo que obtienes abriendo un archivo .p12 en Mail.app y luego accedería a ese elemento en mi aplicación Esperaría que los certificados en perfiles estén disponibles a través de la API de llavero, pero creo que estoy equivocado al respecto.

1) ¿Hay una manera de acceder a un certificado que ya he cargado en el perfil de iPhone en mi aplicación?

2) ¿Qué otras opciones tengo para cargar un certificado especificado por el usuario en mi aplicación? Lo único que se me ocurre es proporcionar alguna interfaz donde el usuario pueda dar una URL a su cerificado .p12, que luego puedo cargar en el llavero de la aplicación para su uso posterior, pero eso no es exactamente lo mismo para los usuarios. Estoy buscando algo que permita al usuario poner el certificado en el teléfono (enviarlo por correo electrónico a él mismo) y luego cargarlo en mi aplicación.

+0

¿Puede decirme cómo cargar el .p12 en la aplicación, por favor? Necesito extraer la clave pública del certificado del cliente. Gracias –

+2

Me puse en contacto con un experto en frameworks de Apple Security, quien confirmó lo que ya se ha dicho aquí: los certificados cargados en los perfiles seting-> general-> solo pueden ser utilizados por las aplicaciones integradas (correo, safari). Su aplicación solo puede usar lo que almacena en su llavero (o llaveros de otras aplicaciones de terceros que comparten el mismo certificado de aprovisionamiento). En cuanto a la carga real, he creado una aplicación incluida con el certificado (solo para la prueba). Leí el .p12 de mi paquete de aplicaciones y obtuve la identidad con SecPKCS12Import. Luego puede usarlo para obtener la clave privada con SecIdentityCopyPrivateKey. –

+1

He intentado con esto: NSString * thePath = [[NSBundle mainBundle] pathForResource: @ "certificate" ofType: @ "p12"]; NSData * PKCS12Data = [[NSData alloc] initWithContentsOfFile: thePath]; CFDataRef inPKCS12Data = (CFDataRef) PKCS12Data; \t CFStringRef contraseña = CFSTR ("pase"); const void * keys [] = {kSecImportExportPassphrase}; const void * values ​​[] = {password}; CFDictionaryRef optionsDictionary = CFDictionaryCreate (NULL, claves, valores, 1, NULL, NULL); Elementos CFArrayRef = CFArrayCreate (NULL, 0, 0, NULL); SecPKCS12Import (inPKCS12Data, optionsDictionary, & items); artículos está vacío.¿Qué está pasando? –

Respuesta

0

que hace el código sugerido en Finding a Certificate In the Keychain trabajo para usted?

+0

No, traté de buscar la clave kSecClass con los valores kSecClassIdentity, kSecClassCertificate y kSecClassKey, pero siempre obtengo un resultado vacío. Luego leo más para descubrir que el llavero de iphone es por aplicación, es decir, puedes acceder solo a lo que pones en él y solo su aplicación (y otras aplicaciones firmadas con un certificado de aprovisionamiento con el mismo ID de aplicación) tienen acceso a ese llavero. –

+0

Bueno, entonces para responder r su segunda pregunta: no hay API o AppStore, una forma aceptable de cargar un archivo en el iPhone que no sea especificar una URL y descargarlo ... –

1

Si un archivo .p12 no es demasiado grande se podría codificar usando Base64 y luego incrustar un enlace en un correo electrónico con un esquema de URL personalizada, por ejemplo:

myapp://certificate/<base 64 data> 

usuario hace clic en el enlace, su aplicación guarda el certificado en algún lugar para uso futuro. Solo asegúrate de que Mail.app en el iPhone no destruya el correo electrónico.

+0

Hay una razón detrás de esto y podría terminar intentándolo, pero incluso si funciona, el usuario debe codificar el certificado en Base64 y crear este correo electrónico que no es fácil de usar. –

+0

Pensando en ello, la forma más fácil de obtener Mail.app para jugar a la pelota es enviar un correo electrónico HTML y usar etiquetas A para el enlace. –

+1

¿No podría proporcionar una aplicación o un sitio web para que lo haga por ellos? –

2

He intentado con esto:

NSString *thePath = [[NSBundle mainBundle] pathForResource:@"certificate" ofType:@"p12"]; 
NSData *PKCS12Data = [[NSData alloc] initWithContentsOfFile:thePath]; 
CFDataRef inPKCS12Data = (CFDataRef)PKCS12Data; 
CFStringRef password = CFSTR("pass"); 
const void *keys[] = { kSecImportExportPassphrase }; 
const void *values[] = { password }; 
CFDictionaryRef optionsDictionary = CFDictionaryCreate(NULL, keys, values, 1, NULL, NULL); 
CFArrayRef items = CFArrayCreate(NULL, 0, 0, NULL); 
SecPKCS12Import(inPKCS12Data, optionsDictionary, &items); 

inPKCS12Data es correcta pero los artículos está vacía. ¿Que esta pasando?

+0

Ese mismo código funciona para mí. SecPKCS12Import devuelve el código de estado OSStatus: obténgalo y vea cuál es el error. –

+0

OSStatus returns -26275 –

+0

No se pueden decodificar los datos proporcionados. –

0

Oh hombre, esto trae recuerdos dolorosos de octubre/noviembre de 2009. Pude conseguir con éxito certs del lado del cliente pero tuve que portar libcurl al iPhone (lo cual no fue fácil ya que el NDA aún estaba en efecto en ese momento).

No he hecho el desarrollo de aplicaciones de iPhone en más de un año, así que no sé cuánto se cambia, pero si fuera usted, primero trataría de pasar sin certificaciones del lado del cliente y si es absolutamente necesario tenerlos puede usar libcurl con certs con formato PEM.

2

He hecho esto para una aplicación reciente al hacer la carpeta de documentos para la aplicación accesible a través de iTunes. A continuación, se instruye a nuestros usuarios para que arrastren su clave generada (en un archivo de formato p12) al panel de documentos de nuestra aplicación en iTunes. Cuando se inicia la aplicación, comprueba la existencia del archivo p12 y, si existe, importa el archivo al llavero.

No es el procedimiento más simple, pero es el más seguro, ya que no tiene un archivo de clave privada que se envía por correo electrónico en todo.

1

Apple restringe el uso de claves/certificados en todo el dispositivo a sus propias aplicaciones/servicios, tales como WiFi, VPN, Mail, etc. Las aplicaciones de terceros no pueden usar ninguna de estas claves/certs (sin jailbreaking). Sin embargo, las aplicaciones pueden importar, almacenar y usar claves y certificados en un llavero en la aplicación. Además, puede compartir claves/certificados en múltiples aplicaciones con la función keychain-access-group en iOS.

Recientemente publiqué una publicación de blog titulada In-App Mobile Certificates Made Easy with mCMS, que puede haberte ayudado. Nuestra compañía está desarrollando una API que facilita el soporte de certificados en aplicaciones, obtenidos directamente de su PKI basada en Microsoft. Nuestra solución también ofrece la generación de claves en el dispositivo, en lugar de generar un P12 en otra máquina e intentar importarlo a su aplicación.

1

Si está utilizando AirWatch para la distribución de aplicaciones, su SDK ofrece la posibilidad de aprovisionar certificados de su Autoridad de certificación a sus dispositivos registrados. Esto le permite aprovisionar sus certs y luego acceder a ellos desde el código de su aplicación.

+0

¿Tiene un fragmento de código que acceda a los certificados? –

+0

Sí, un fragmento de código que funcione para usted con Airwatch realmente lo ayudará. ¡Gracias! – archeopetrix

Cuestiones relacionadas