2010-07-05 13 views
5

Estoy escribiendo una aplicación de iPhone y me gustaría conectarme a un servidor 'HTTPS' para obtener información. Sin embargo, me sale el error en la consola que es"certificado de servidor que no es de confianza" en el iPhone

NSUnderlyingError = error de dominio = Código kCFErrorDomainCFNetwork = -1,202 UserInfo = 0x3e95cf0 "El certificado para este servidor no es válido. Usted posible que se conecta a un servidor que es pretendiendo ser "ejemplo.com" que podría poner su información confidencial en riesgo. "; }

¿Cómo puedo confiar en el certificado y obtener el código de estado HTTP 200

La siguiente es mi código.

NSMutableURLRequest *request_get2 = [[[NSMutableURLRequest alloc] init] autorelease]; 
    [request_get2 setURL:[NSURL URLWithString:@"https://www.example.com"]]; 
    [request_get2 setHTTPMethod:@"GET"]; 
    [request_get2 setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Content-Type"]; 
    //[request_get2 setValue:@"text/html; charset=UTF-8" forHTTPHeaderField:@"Content-Type"]; 
    [request_get2 setValue:@"https://www.example.com" forHTTPHeaderField:@"Referer"]; 
    [request_get2 setHTTPShouldHandleCookies:YES]; 
    // cookiesString is in format "cookieName=cookieValue;" 
    [request_get2 setValue: (NSString *) cookiesString forHTTPHeaderField:@"Cookie"]; 


    // doGet - response 
    NSHTTPURLResponse *response_get2 = nil; // it change from 'NSURLRespaonse' to 'NSHTTPURLResponse' 
    NSError *error_get2 = nil; 
    NSData *responseData_get2 = [NSURLConnection sendSynchronousRequest:request_get2 returningResponse:&response_get2 error:&error_get2]; 
    NSString *data_get2 = [[NSString alloc]initWithData:responseData_get2 encoding:NSUTF8StringEncoding]; 

    if (!error_get2) { 
     NSString *responseURL_get2 = [[response_get2 URL] absoluteString];   // null value 
     NSString *responseTextEncodingName_get2 = [response_get2 textEncodingName]; // null value 
     NSString *responseMIMEType_get2 = [response_get2 MIMEType];     // null value 
     NSUInteger *responseStatusCode_get2 = [response_get2 statusCode]; //[responseStatusCode intValue]; // the status code is 0 
    } 
    else { 
     NSLog(@"\nsomething went wrong: %@\n", [error_get2 userInfo]); // got the error in here 
    } 

Respuesta

11

creo que la adición de un certificado no es de confianza es (al menos en el simulador) no es posible, pero se puede decir que su NSURLConnection Delegado para aceptar certificados auto firmado (o los generalmente no son de confianza)

En el siguiente enlace me ayudó a resolver el problema!

How to use NSURLConnection to connect with SSL for an untrusted cert?

+0

gracias, sam. Es muy útil. Pero todavía tengo 1 pregunta, ¿dónde debería poner el código? Solía ​​poner el código dentro de una clase .m Pero no funcionó. Revisé el sitio web para desarrolladores de Apple, sé que son funciones predefinidas, pero ¿dónde debería llamarlo? También solía poner NSLog() para imprimir el contenido, pero no pude ver el contenido del NSLog. muchas gracias. – Questions

+0

por favor vea mi respuesta en su otro hilo con la misma pregunta :) .. thxs – samsam

0

Confiar en todos los certificados es una muy mala idea. Una persona malintencionada puede realizar un ataque Man-in-the-Middle en sus usuarios para leer o cambiar todos los datos transferidos.

Creo que su certificado no contiene todos los certificados intermedios necesarios para validar la ruta a un certificado raíz confiable del sistema. Se puede informar como cadena de certificado incompleta por algunas herramientas de validación de configuración de SSL.

Puede resolver el cadena de certificado incompleto problema manualmente mediante la concatenación de todos los certificados del certificado al certificado raíz de confianza (exclusivo, en este orden), para evitar tales problemas. Tenga en cuenta que el certificado raíz de confianza no debería estar allí, ya que ya está incluido en el almacén de certificados raíz del sistema.

Debería poder obtener certificados intermedios del emisor y concaturarlos juntos usted mismo. He escrito una secuencia de comandos para automatizar el procedimiento, se necesita un certificado para producir resultados de certificados correctamente encadenados. https://github.com/zakjan/cert-chain-resolver

Cuestiones relacionadas