ios ssl afnetworking

ios - Fijación SSL con AFNetworking



(3)

En mi aplicación, uso https y un certificado SSL autofirmado para asegurar la conexión entre mi cliente y el servidor.

Estaba intentando que la biblioteca de AFNetworking hiciera la fijación de SSL en una copia de mi certificado 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 de mi AFJSONRequestOperation , establecí la propiedad AFSSLPinningModeCertificate en AFSSLPinningModeCertificate .

Pero cuando intento realizar una solicitud 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 certificados .cer, pero en mi servidor web alojado en mi sistema operativo X tengo un certificado .crt.

¿Este es el problema? ¿Hay alguna manera de hacer que AFNetworking funcione con .crt?

En una caja de Windows, convertí mi .crt a .cer e intenté incluirlo en mi aplicación, pero sigo teniendo el mismo error. ¿Debo tratar de cambiar el archivo .crt con el .cer recién creado, incluso en el lado del servidor?


Lo tengo funcionando.

Estaba en una situación en la que había creado un certificado autofirmado para aplicar mi API de servidor desde mi aplicación de iOS. Creé mi certificado con OpenSSL. Cuando terminé de crearlo, tenía varios archivos, uno de los cuales era "server.crt". Inicialmente, intenté cambiarle el nombre a "server.cer" y usar "AFSSLPinningModeCertificate" para mis objetos AFURLConnectionOperation. Eso no funcionó, y noté que el ejemplo usa "AFSSLPinningModePublicKey", así que lo intenté, todavía sin suerte.

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

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

Observé por el ejemplo de Mattt en AFNetworking que el archivo "adn.cer" que usa no está codificado en base64. Son solo bytes crudos. Entonces, hice esto:

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

Configuré mi AFURLConnectionOperation en AFSSLPinningModePublicKey.
Lo volví a poner en el proyecto e hice una limpieza y compilación de mi proyecto iOS, y todo funcionó bien.

¡¡Espero que esto ayude!!

Por cierto, puede observar que Xcode mostrará información para su clave ".crt" o ".cer" ya sea la base64 o la cruda, así que no deje que eso lo confunda. Debería poder ver los datos del certificado en cualquier caso, es solo que AF solo aceptará el crudo (no base64).

ACTUALIZAR:
Cualquiera que tenga problemas con base64, esto funciona para mí 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 sigue recibiendo 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 certificados en pinnedCertificates .


Su certificado debe tener la extensión cer not crt y debe estar en formato .der. Agregue el archivo de salida a su proyecto de Xcode.

Puede usar el siguiente comando:

openssl x509 -en su.crt -out certificate_cer.cer -outform der