Pinning SSL con AFNetworking

En mi aplicación utilizo https y un certificate SSL autofirmado para asegurar la connection entre mi cliente y el server.

Estaba intentando que la biblioteca AFNetworking hiciera SSL Pinning en una copy de mi certificate incluido en la aplicación.

En el encabezado AFURLConnectionOperation ambos:

 #define _AFNETWORKING_ALLOW_INVALID_SSL_CERTIFICATES_ =1 #define _AFNETWORKING_PIN_SSL_CERTIFICATES_ =1 

Y antes de llamar al start en mi AFJSONRequestOperation , establezco la propiedad AFSSLPinningModeCertificate en AFSSLPinningModeCertificate .

Pero cuando trato de realizar una request JSON sigo recibiendo el siguiente error:

 Error Domain=NSURLErrorDomain Code=-1012 "The operation couldn't be completed. (NSURLErrorDomain error -1012.)" UserInfo=0x758f120 {NSErrorFailingURLKey=https://mydomain.com, NSErrorFailingURLStringKey=https://mydomain.com} 

En el encabezado AFURLConnectionOperation , leí que SSL Pinning funciona con certificates .cer, pero en mi server web OS X autoasistido tengo un certificate .crt.

¿Es este el problema? ¿Hay alguna manera de hacer que AFNetworking funcione con .crt?

En un cuadro de Windows, convertí mi .crt a .cer e intenté combinarlo en mi aplicación, pero aún recibo el mismo error. ¿Debo intentar cambiar el file .crt con el .cer recién creado incluso en el lado del server?

Lo tengo trabajando.

Estaba en la situación en la que había creado un certificate autofirmado para acceder a mi propia API de server desde mi aplicación iOS. Creé mi certificate con OpenSSL. Cuando terminé de crearlo, tenía varios files, uno de los cuales era "server.crt". Inicialmente, intenté simplemente cambiar el nombre a "server.cer" y usar "AFSSLPinningModeCertificate" para mis objects AFURLConnectionOperation. Eso no funcionó, y noté que el ejemplo usa "AFSSLPinningModePublicKey", así que intenté eso, aún sin suerte.

Así que comparé mi file (que era el file ".crt") con el suyo.
Noté que "server.crt" estaba codificado en base64, y así:

 -----BEGIN CERTIFICATE----- 394230AFDFD... -----END CERTIFICATE----- 

Me di count del ejemplo de Mattt en AFNetworking que el file "adn.cer" que usa no está codificado en base64. Es solo bytes en bruto. Entonces hice esto:

 $ base64 -D -i ./server.crt -o ./server.cer 

Configuré mi AFURLConnectionOperation en AFSSLPinningModePublicKey.
Puse eso de vuelta en el proyecto e hice una limpieza y construcción de mi proyecto de iOS, y todo funcionó bien.

¡¡Espero que esto ayude!!

Por cierto, puede notar que Xcode mostrará información para su key ".crt" o ".cer", ya sea base64 o raw, así que no dejes que eso te confunda. Debería poder ver los datos del certificate en cualquier caso, es solo que AF solo aceptará la información en bruto (no base64).

ACTUALIZAR:
Cualquier persona que tenga problemas con base64, esto es lo que me funciona en OS X usando OpenSSL:

 $ openssl base64 -d -in ./server.crt -out ./server.cer 

Si está utilizando AFNetworking 2.x, y está utilizando el .cer correcto pero aún recibe el código de error -1012 en sus llamadas, debe deshabilitar validatesCertificateChain :

 AFSecurityPolicy *securityPolicy = [AFSecurityPolicy policyWithPinningMode:AFSSLPinningModePublicKey]; securityPolicy.validatesCertificateChain = NO; 

o puede pasarlo todo en toda la cadena de certificates en certificaciones pinnedCertificates .