last example afhttprequestoperation ios ssl afnetworking afnetworking-2

ios - example - Problemas con la fijación de SSL y AFNetworking 2.5.0(NSURLErrorDomain error-1012.)



http alamofire (8)

¡Para mí, tuve use_frameworks! establecido en mi Podfile - el proyecto no hace que el usuario de Swift y yo AFNetworking usando Pods para AFNetworking . Comentando esto, solucionó el problema por mí.

Hemos estado teniendo dificultades para asegurar las conexiones de red de nuestra aplicación con SSL utilizando AFNetworking 2.5.0.

Usamos una autoridad de certificación autofirmada e implementamos una política de seguridad personalizada mediante certificados fijados.

Hemos probado bastantes configuraciones proporcionadas por AFNetworking pero hasta ahora no hemos tenido suerte. El mensaje de error que recibimos es:

2015-01-05 19: 03: 07.191 AppName [9301: 319051] Error al actualizar el viaje del usuario. Error: dominio de error = NSURLErrorDomain Code = -1012 "La operación no se pudo completar. (NSURLErrorDomain error -1012.)" UserInfo = 0x7ae056b0 {NSErrorFailingURLKey = https://api.XXX.com/XXX/XXX/ , NSErrorFailingURLStringKey = https://api.XXX.com/XXX/XXX/ }

Nuestro certificado funciona bien en otros clientes como cURL y Android. Cuando usamos HTTP, nuestra implementación funciona perfectamente bien también.

¿Alguien está enterado de algún problema relacionado con los certificados fijados y AFNetworking? En caso afirmativo, apreciaríamos cualquier información que pueda tener.

Aquí hay parte de la implementación:

+ (AFSecurityPolicy*)customSecurityPolicy { AFSecurityPolicy *securityPolicy = [AFSecurityPolicy policyWithPinningMode:AFSSLPinningModeNone]; NSString *cerPath = [[NSBundle mainBundle] pathForResource:@"filename" ofType:@"der"]; NSData *certData = [NSData dataWithContentsOfFile:cerPath]; [securityPolicy setAllowInvalidCertificates:NO]; [securityPolicy setValidatesCertificateChain:NO]; [securityPolicy setPinnedCertificates:@[certData]]; return securityPolicy; } + (AFHTTPRequestOperationManager*)customHttpRequestOperationManager { AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager]; manager.securityPolicy = [self customSecurityPolicy]; // SSL return manager; } +(void)getRequestWithUrl:(NSString*)url success:(void(^)(AFHTTPRequestOperation *operation, id responseObject))success failure:(void(^) (AFHTTPRequestOperation *operation, NSError *error))failure { [[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:YES]; AFHTTPRequestOperationManager *manager = [HttpClient customHttpRequestOperationManager]; manager.responseSerializer = [AFHTTPResponseSerializer serializer]; [manager GET:url parameters:nil success:^(AFHTTPRequestOperation *operation, id responseObject) { [[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:NO]; success(operation, responseObject); } failure:^(AFHTTPRequestOperation *operation, NSError *error) { [[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:NO]; failure(operation, error); }]; }

¡Gracias!


Después de leer el código de AFNetworking y verificar los registros de cambios, esto es lo que tuve que hacer para que esto funcione.

Cree su objeto AFSecurityPolicy con AFSSLPinningModeCertificate:

AFSecurityPolicy* policy = [AFSecurityPolicy policyWithPinningMode:AFSSLPinningModeCertificate];

Por defecto, AFNetworking validará el nombre de dominio del certificado. Nuestros certificados se generan por servidor y no todos tendrán un nombre de dominio, por lo que debemos inhabilitarlo:

[policy setValidatesDomainName:NO];

Dado que los certificados son autofirmados, técnicamente son "inválidos", por lo que también debemos permitir eso:

[policy setAllowInvalidCertificates:YES];

Por último, AFNetworking intentará validar el certificado en toda la cadena de certificados, lo que a mí me parece que solo subirá la cadena a NUESTRA CA, pero por alguna razón no es así, así que también tenemos que deshabilitarla.

[policy setValidatesCertificateChain:NO];

¡Y eso es! Establezca la política de seguridad en su administrador de solicitudes como ya lo hace y debería funcionar bien.

Entonces, recapitula, todo lo que realmente necesitas cambiar en el código que publicaste es este:

A) Como mencionó David Caunt , cambie su modo de fijación de AFSSLPinningModeNone a AFSSLPinningModeCertificate

y

B) Agregue la línea para deshabilitar la validación del nombre de dominio: [policy setValidatesDomainName:NO]

Otra nota, AFNetworking ahora comprueba automáticamente si su paquete contiene archivos .cer, de modo que si cambiara el nombre de su certificado para tener una extensión .cer, puede eliminar el código para sacar los datos del certificado del paquete y establecer los certificados fijados.


Está creando un modo AFSecurityPolicy con SSLPinningMode AFSSLPinningModeNone .

Para que AFNetworking confíe en el servidor, con el modo de fijación establecido en AFSSLPinningModeNone , debe establecer allowInvalidCertificates en YES , pero esto es lo contrario de lo que intenta lograr.

En su lugar, debe crear su política de seguridad con el modo de fijación AFSSLPinningModeCertificate o AFSSLPinningModePublicKey :

AFSecurityPolicy *securityPolicy = [AFSecurityPolicy policyWithPinningMode:AFSSLPinningModeCertificate];


Habiendo lidiado con un problema similar, es común que las cosas parezcan normales a través de las conexiones HTTPS del navegador, ya que muchos navegadores almacenan en caché los archivos de certificados de terceros para que no siempre tengan que cargarse. Por lo tanto, podría ser que su cadena de certificados no sea del todo confiable, como le hicieron creer.

En otras palabras, puede parecer correcto conectarse de manera segura con un navegador, pero dependiendo de su configuración de AFNetworking, su aplicación no aceptará su cadena de certificados. Una vez que esté seguro de que su configuración es adecuada, el siguiente paso es asegurarse de que su cadena de certificados sea tan buena como cree que es. Descarga una aplicación llamada SSL Detective y consulta tu servidor. También puede usar www.ssldecoder.org . Asegúrese de que no haya elementos rojos (que no sean de confianza) en su cadena. Si hay, cambie su configuración de cert en el servidor.

Dado que su configuración AFNetworking es la siguiente:

[securityPolicy setAllowInvalidCertificates:NO]; [securityPolicy setValidatesCertificateChain:NO];

Puede que no le guste su cadena de certificados porque está auto firmada. Es posible que también deba cambiarlos a SÍ.


Intenté todo esto pero nada me sirvió, luego busqué esta línea

''NSLog (@) Para validar un nombre de dominio para certificados autofirmados, DEBE usar pinning. ");''

y debajo de esta línea, cambié

''devuelve NO''
a

''devuelve SÍ;''

y hizo la magia.

Gracias.


ya que tiene administrador inicializado, puede hacer:

manager.securityPolicy.allowInvalidCertificates = YES; manager.securityPolicy.validatesDomainName = NO;

y funcionará para un certificado autofirmado


Error Domain=NSURLErrorDomain Code=-1012 NSErrorFailingURLStringKey este error, Error Domain=NSURLErrorDomain Code=-1012 NSErrorFailingURLStringKey

El siguiente cambio solo lo hizo funcionar para mí.

self.validatesDomainName = NO;


- (AFSecurityPolicy *)securityPolicy { NSString *cerPath = [[NSBundle mainBundle] pathForResource:@"*.something.co.in" ofType:@"cer"]; NSData *certData = [NSData dataWithContentsOfFile:cerPath]; AFSecurityPolicy *securityPolicy = [AFSecurityPolicy policyWithPinningMode:AFSSLPinningModeCertificate]; [securityPolicy setAllowInvalidCertificates:YES]; [securityPolicy setPinnedCertificates:@[certData]]; [securityPolicy setValidatesDomainName:NO]; [securityPolicy setValidatesCertificateChain:NO]; return securityPolicy; }

Esto funcionó para mí por alguna razón. Todavía no estoy seguro de cómo esto cambia las cosas porque otras conexiones en mi aplicación funcionan sin seguir todos estos pasos.

Así es como se ve la política de seguridad de generación de errores:

- (AFSecurityPolicy *)securityPolicy { NSString *cerPath = [[NSBundle mainBundle] pathForResource:@"*.something.co.in" ofType:@"cer"]; NSData *certData = [NSData dataWithContentsOfFile:cerPath]; AFSecurityPolicy *securityPolicy = [AFSecurityPolicy policyWithPinningMode:AFSSLPinningModeCertificate]; [securityPolicy setAllowInvalidCertificates:NO]; [securityPolicy setPinnedCertificates:@[certData]]; [securityPolicy setValidatesDomainName:YES]; return securityPolicy; }

Ahora apegándonos a la regla "No arreglar si no está roto"