AFNetworking necesita evitar el control de ssl

Tengo una aplicación que se conecta directamente a enrutadores de hardware. Desde iOS 9 actualicé AFNetworking y ahora recibo errores ssl cuando bash conectarme a través de https .

Este no es un problema de App Transport Security iOS 9 , ya que agregué la input pertinente .plist para omitirla y las conexiones funcionan bien sobre http .

Necesito pasar por alto la comprobación de certificates ya que cada enrutador tiene su propio certificate autofirmado, por lo que obviamente no puedo agregar los certificates a mi aplicación ya que cada usuario es diferente.

Utilizo una subclass AFHTTPRequestOperation para conexiones y he configurado self.securityPolicy.allowInvalidCertificates = YES; pero me sale el siguiente error:

Error durante la connection: Error Domain = NSURLErrorDomain Code = -1200 "Se ha producido un error SSL y no se puede establecer una connection segura con el server". UserInfo = {_ kCFStreamErrorCodeKey = -9806, NSLocalizedRecoverySuggestion = ¿Desea conectarse al server de todas forms? NSUnderlyingError = 0x7fa9f3611b40 {Error Domain = kCFErrorDomainCFNetwork Code = -1200 "Se ha producido un error SSL y no se puede establecer una connection segura con el server. " UserInfo = {NSErrorFailingURLStringKey = https://myserver.com:4780/Info.htm , NSLocalizedRecoverySuggestion = ¿Desea conectarse al server de todas forms? _kCFNetworkCFStreamSSLErrorOriginalValue = -9806, _kCFStreamPropertySSLClientCertificateState = 0, NSLocalizedDescription = Ocurrió un error SSL y un error no se puede realizar una connection segura con el server., _kCFStreamErrorDomainKey = 3, NSErrorFailingURLKey = https://myserver.com:4780/Info.htm , _kCFStreamErrorCodeKey = -9806}}, NSLocalizedDescription = Se ha producido un error SSL y una connection segura con el server. server no se puede hacer., NSErrorFailingURLKey = https://myserver.com:4780/Info.htm , NSErrorFailingURLStringKey = https://myserver.com:4780/Info.htm , _kCFStreamErrorDomainKey = 3}

También he intentado agregar setWillSendRequestForAuthenticationChallengeBlock: sin embargo, el bloque nunca recibe una llamada.

¿Puede ayudarme alguien, por favor?

Gracias

EDIT —– Configuración de self.securityPolicy.validatesDomainName = NO; tambien no funciona Me pregunto si es un problema con el tipo de certificate en el hardware.

EDIT 2 —– Aquí está el certificate

Nuevo, TLSv1 / SSLv3, encryption es DES-CBC3-SHA La key pública del server es 2048 bits La renegociación segura NO es compatible Compresión: NINGUNO Expansión: NINGUNO SSL-Sesión: Protocolo: SSLv3 Cifrado: DES-CBC3-SHA Sesión ID: 010000000C6B8632215649C0665E9DCC9EC59E22F8F021672B6B50B84222A342 Sesión -ID-ctx: Clave maestra: D71EC7D8F7A4A3581E25CDAD9C532B2C7B4DA8B513AF337095496B575F525CFBA02A40797B2D2A4F0B5911EFEFC3623F Clave-Arg: Ninguno Hora de inicio: 1443102149 Tiempo de espera: 300 (segundo) Verifique el código de retorno: 18 (certificate autofirmado)

EDIT 3 ——– Agregar este código a mi subclass AFHTTPRequestOperation hace que funcione en iOS 8, sin embargo, el bloque ni siquiera se AFHTTPRequestOperation en iOS 9.

 [self setWillSendRequestForAuthenticationChallengeBlock:^(NSURLConnection * _Nonnull connection, NSURLAuthenticationChallenge * _Nonnull challenge) { NSLog(@"**** HERE ****"); if ([challenge.protectionSpace.authenticationMethod isEqualToString:NSURLAuthenticationMethodServerTrust]) { [challenge.sender useCnetworkingential:[NSURLCnetworkingential cnetworkingentialForTrust:challenge.protectionSpace.serverTrust] forAuthenticationChallenge:challenge]; } [challenge.sender continueWithoutCnetworkingentialForAuthenticationChallenge:challenge]; }]; 

Encontré problemas similares y, en mi caso, resolví establecer la política de security en AFSSLPinningModeNone y, obviamente, permitir los certificates no válidos.

Un ejemplo en Obj-C:

 AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager]; AFSecurityPolicy *securityPolicy = [AFSecurityPolicy policyWithPinningMode:AFSSLPinningModeNone]; securityPolicy.allowInvalidCertificates = YES; manager.securityPolicy = securityPolicy; [manager POST:url parameters:nil success:^(AFHTTPRequestOperation *operation, id responseObject) { NSLog(@"Response: %@",responseObject); } failure:^(AFHTTPRequestOperation *operation, NSError *error) { NSLog(@"Error: %@", error); }]; 

De la documentation de Apple :

Comportamiento pnetworkingeterminado

Todas las conexiones que utilizan las interfaces NSURLConnection, CFURL o NSURLSession utilizan el comportamiento pnetworkingeterminado de Seguridad de transporte de aplicaciones en aplicaciones creadas para iOS 9.0 o posterior y OS X v10.11 o posterior. Las conexiones que no cumplan con los requisitos fallarán. Para get más información sobre varios methods de connection, consulte NSURLConnection Class Reference, CFURL Reference o NSURLSession Class Reference.

Estos son los requisitos de security de transporte de aplicaciones:

El server debe admitir al less la versión 1.2 del protocolo de security de capa de transporte (TLS). Los encryptions de connection están limitados a aquellos que proporcionan el secreto de avance (consulte la list de encryptions a continuación). Los certificates deben firmarse utilizando un algorithm hash de firma SHA256 o superior, con una key RSA de 2048 bits o superior o un bloque elíptico de 256 bits o superior -Curve (ECC) key. Los certificates no válidos provocan una falla grave y no tienen connection. Estos son los valores aceptados:

TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384 TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256 TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384 TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256 TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384 TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256 TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA

Es posible que desee actualizar la configuration de security de su hardware para que sea compatible con la anterior y / o establezca NSExceptionMinimumTLSVersion en TLSv1.0

En tu subclass de AFHTTPRequestOperation, implementa lo siguiente:

 - (BOOL)connection:(NSURLConnection *)connection canAuthenticateAgainstProtectionSpace:(NSURLProtectionSpace *)protectionSpace { if ([protectionSpace.authenticationMethod isEqualToString:NSURLAuthenticationMethodServerTrust]) { return YES; } return [super connection:connection canAuthenticateAgainstProtectionSpace:protectionSpace]; } - (void)connection:(NSURLConnection *)connection didReceiveAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge { if ([challenge.protectionSpace.authenticationMethod isEqualToString:NSURLAuthenticationMethodServerTrust]) { [challenge.sender useCnetworkingential:[NSURLCnetworkingential cnetworkingentialForTrust:challenge.protectionSpace.serverTrust] forAuthenticationChallenge:challenge]; return; } return [super connection:connection didReceiveAuthenticationChallenge:challenge]; } 

Para permitir un certificate SSL no válido con AFNetworking. Agregue la siguiente línea en AFURLConnectionOperation.h debajo de #import Availability.h

define _AFNETWORKING_ALLOW_INVALID_SSL_CERTIFICATES_ 1

 AFSecurityPolicy *securityPolicy = [AFSecurityPolicy policyWithPinningMode:AFSSLPinningModeNone]; securityPolicy.allowInvalidCertificates = YES; manager.securityPolicy = securityPolicy;