2011-10-17 19 views
9

Tengo una aplicación que usa ASIHTTPRequest.iOS 5: https (ASIHTTPRequest) deja de funcionar

I vuelve a compilar mi aplicación con IOS 5 (SDK: 5,0/Xcode: 4.2 Build 4D199) y el conexiones HTTPS fallar con el mensaje de error (la misma llamada con https obras discapacitados finas):

Error Domain=ASIHTTPRequestErrorDomain Code=1 "A connection failure occurred" UserInfo=0xa8e66e0 {NSUnderlyingError=0xa8ac6c0 "The operation couldn’t be completed. (OSStatus error -9844.)", NSLocalizedDescription=A connection failure occurred} 

Con registro de depuración habilitada:

[STATUS] Starting asynchronous request <ASIFormDataRequest: 0xd96fc00> 

[CONNECTION] Request <ASIFormDataRequest: 0xd96fc00> will not use a persistent connection 

[STATUS] Request <ASIFormDataRequest: 0xd96fc00>: Failed 

[CONNECTION] Request #(null) failed and will invalidate connection #(null) 

me encontré con este post relacionados: https://devforums.apple.com/message/537440#537440 que podría expl A mi problema

basado en la idea de que el IOS 5 prefieren TLS 1.2, trato de cambiar la configuración de kCFStreamSocketSecurityLevelTLSv1 en AIHTTPRequest.m

NSDictionary *sslProperties = [[NSDictionary alloc] initWithObjectsAndKeys: 
            [NSNumber numberWithBool:YES], 
kCFStreamSSLAllowsExpiredCertificates, 
            [NSNumber numberWithBool:YES], kCFStreamSSLAllowsAnyRoot, 
            [NSNumber numberWithBool:NO], kCFStreamSSLValidatesCertificateChain, 
            kCFNull,kCFStreamSSLPeerName, 
             kCFStreamSocketSecurityLevelTLSv1, kCFStreamSSLLevel,// my modif 
            nil]; 

sin éxito. Tal vez mi modificación es incorrecta?

Detalles:

  • me dieron el ARC deshabilitado
  • utilizo libz.1.2.5.dylib
  • He actualizado el ASIHTTPRequest hace una semana.

No sé si el problema es una historia de certificado (como la versión TLS) u otra cosa.

¡cualquier ayuda/idea es bienvenida!

Respuesta

6

Aquí está la solución final:

https://developer.apple.com/library/ios/#technotes/tn2287/_index.html#//apple_ref/doc/uid/DTS40011309

 NSDictionary *sslProperties = [[NSDictionary alloc] initWithObjectsAndKeys: 
             [NSNumber numberWithBool:YES], kCFStreamSSLAllowsExpiredCertificates, 
             [NSNumber numberWithBool:YES], kCFStreamSSLAllowsAnyRoot, 
             [NSNumber numberWithBool:NO], kCFStreamSSLValidatesCertificateChain, 
             kCFNull,kCFStreamSSLPeerName, 
             @"kCFStreamSocketSecurityLevelTLSv1_0SSLv3", kCFStreamSSLLevel, 
             nil]; 

La adición de este param:

         @"kCFStreamSocketSecurityLevelTLSv1_0SSLv3", kCFStreamSSLLevel, 
+1

Vea también este parche: https://github.com/ignaval/asi-http-request/commit/c782abbeb204156d30ecbb902915d1eaf9b10f9e#comments - desea agregar la propiedad al caso validateCertificate = YES también – ckhan

+0

Para mí, el cambio de @ ckhan fue requerido también antes de que funcione en 5.0 – leontx

+0

force 'kCFStreamSocketSecurityLevelTLSv1_2' funciona con este método también – ReDetection

1

Estas son las cosas que me gustaría probar:

  1. descargar una copia fresca de asihttprequest, ponerlo en una aplicación muy sencilla de nueva creación que sólo hace sola HTTP y ver si se comporta de la misma
  2. Try contra otros servidores https ver si obtienes el mismo comportamiento (prueba con algunos de los de renombre, por ejemplo, https://twitter.com - linkedin, google, etc., todos tienen versiones https)
  3. Prueba el mismo servidor en Safari (aún en iOS dispositivo)

Por lo que vale, tengo ASIHTTPRequest en iOS5 que funciona bien con los servidores https de mi cliente; no tuve que hacer ningún cambio para iOS5.

+0

gracias por las sugerencias. # 1: sin cambios; # 2: otra página web funciona bien. ; # 3: con el navegador nativo, la página se muestra como se esperaba. ; ¿Podría ser tan amable de decirme con una versión de TLS el uso del servidor de su cliente cuando lo llama desde su aplicación? – Loda

+0

No estoy sinceramente seguro; ¿sabes cómo lo comprobaría? A partir de la evidencia hasta ahora, parece que es el mismo problema de TLSv1.2 que el enlace que publicaste en los foros de Apple. ¿Tal vez deberías publicar tu código allí y esperar que Quinn pueda echarle un vistazo? – JosephH

+0

como temía, y como sugirió, podría tratarse de un problema relacionado con el servidor. Entonces, no estoy seguro de cómo puedo preguntar esto en un foro (NDA). De todos modos, si la versión TLS es el problema, ¿por qué mi modificación no lo soluciona? ... Gracias por la ayuda de todos modos, me alegra saber que no es un problema general con ASIHTTPRequest/iOS5. – Loda

1

Pruebe usar kCFStreamSocketSecurityLevelSSLv3 en lugar de TLSv1. Eso funcionó para mí cuando me encontré con una situación similar.No estoy seguro de por qué la autonegociación no está recayendo en el protocolo correcto, pero al menos en algunos servidores parece fallar en ASIHttpRequest, donde funcionaría con NSURLConnection.

6

En nuestra configuración el problema se solucionó mediante la inserción de

[sslProperties setObject:(NSString *)kCFStreamSocketSecurityLevelSSLv3 forKey:(NSString *)kCFStreamSSLLevel]; 

justo por encima

CFReadStreamSetProperty((CFReadStreamRef)[self readStream], kCFStreamPropertySSLSettings, sslProperties); 

en la sección de configuración del certificado SSL manija.

EDIT: Según http://developer.apple.com/library/ios/#technotes/tn2287/_index.html#//apple_ref/doc/uid/DTS40011309 la siguiente debe ser más robusto

[sslProperties setObject:@"kCFStreamSocketSecurityLevelTLSv1_0SSLv3" forKey:(NSString *)kCFStreamSSLLevel]; 
+0

Gracias por la solución. Esto funciona para mi aplicación de iPhone, pero cuando pongo la misma línea en mi iPad ASIHTTPRequest, no funciona. ¿Cuál podría ser la posible solución? Gracias. :) – Akshay

+0

Desde que respondí esta pregunta, ASI ha dejado de mantener ASIHTTPRequest y he comenzado a usar AFNetworking https://github.com/AFNetworking/AFNetworking. – weibel