2011-05-11 18 views
34

Pido disculpas de antemano por la pregunta prolija. Tengo problemas con un certificado SSL autofirmado y quiero documentar todo lo que he intentado hasta ahora.Utilice un certificado ssl autofirmado en una aplicación para iphone

Estoy trabajando en una aplicación que se comunica con un servicio REST. El servidor de prueba utiliza un certificado SSL autofirmado que puedo instalar en mi computadora sin problemas. Es un archivo .p12 que requiere una contraseña para instalar. Sin este certificado instalado, todas las peticiones al servidor devuelven un 403.

El p.12 instala tres artículos en el llavero, una "autoridad de certificación raíz", un certificado de "usuario de prueba" que se emite por la "autoridad de certificación raíz" y una clave privada que está asociada con el certificado "usuario de prueba".

He instalado este certificado en mi iPad enviándome el archivo .p12. Hice tapping en el archivo adjunto, ingresé la contraseña y ahora puedo acceder al sitio en Safari. Desafortunadamente, debido a la zona de pruebas de aplicaciones, esto no es suficiente para que mi aplicación se comunique con el servicio REST.

Estoy usando ASIHTTPRequest para toda la comunicación con el servicio REST desde mi aplicación. Cada solicitud es una subclase de ASIHTTPRequest. Lo primero que tuve que hacer fue llamar al [self setValidatesSecureCertificate:NO]; para que incluso intentara la conexión SSL al servidor. Si eso es todo lo que hago, recibo 403 códigos de error del servicio.

Ahora no puedo encontrar la manera de obtener la solicitud para usar el certificado. He intentado exportar los tres puntos como archivo .cer separada, incluyéndolas en el proyecto y agregarlos a la solicitud utilizando el código de abajo:

NSData *data = [NSData dataWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"cert" ofType:@"cer"]]; 
SecCertificateRef cert = SecCertificateCreateWithData(NULL, (CFDataRef)data); 
... 
[self setClientCertificates:[NSArray arrayWithObjects:(id)cert, ..., nil]]; 

Mientras que el código se ejecuta sin ningún problema con este enfoque, sigo teniendo el error 403

Incluso he intentado incluir el archivo .p12 en mi aplicación e importarlo con el mismo código. Esto falla porque SecCertificateCreateWithData devuelve nil.

Admito que no se sabe muy bien lo que estoy haciendo aquí. Todo esto está un poco sobre mi cabeza y cualquier ayuda que alguien pueda darme sería muy apreciada.

Respuesta

29

OK, lo descubrí. Estaba ladrando el árbol equivocado.

La información más importante que encontré fue en la documentación de Apple para Certificate, Key, and Trust Services Programming Guide, en particular, la página "Tareas para iOS". Eso detalla cómo extraer la identidad de seguridad del archivo .p12 y cómo agregar una excepción de confianza.

La última pieza del rompecabezas estaba en la documentación de ASIHTTPRequest en Client Certificate Support. Al usar la identidad que extraje directamente del archivo p12, pude pasar eso a la solicitud y obtener todo autenticado correctamente.

espero que esto ayude a cualquier otra persona que tiene que implementar una función similar.

+0

El enlace está roto, supongo que debería ser éste: https://developer.apple.com/library/content/documentation/Security/Conceptual/CertKeyTrustProgGuide/index.html – Oriol

Cuestiones relacionadas