objective-c - válido - iphone mail certificado no confiable
Objective-C/Cocoa: ¿Cómo acepto un certificado de servidor incorrecto? (6)
Me he topado con el mismo problema: estaba desarrollando un cliente SOAP y el servidor de desarrollo tiene un certificado "de cosecha propia". No pude resolver el problema ni siquiera con ese método, ya que no estaba usando NSURL, sino los métodos de WS (pobremente documentados y aparentemente abandonados) y, por el momento, decidí (internamente) usar un protocolo que no sea SSL. conexión.
Una vez dicho esto, sin embargo, la pregunta que viene a la mente es, si no estás dispuesto a utilizar una API privada en una aplicación de producción, ¿deberías permitir el acceso a un sitio con un certificado dudoso?
Citaré a Jens Alfke :
Eso no es solo un problema teórico de seguridad. Alguna cosa
como el 25% de los servidores DNS públicos se han visto comprometidos, de acuerdo con
informes recientes, y puede dirigir a los usuarios a sitios de phishing / malware / anuncios incluso
si ingresan correctamente el nombre de dominio. Lo único que te protege
de eso es la comprobación del certificado SSL.
Al utilizar NSURLRequest , intento acceder a un sitio web que tiene un certificado caducado. Cuando envío la solicitud, mi método connection: didFailWithError delegate se invoca con la siguiente información:
-1203, NSURLErrorDomain, bad server certificate
Mis búsquedas solo han arrojado una solución: un método de clase oculto en NSURLRequest:
[NSURLRequest setAllowsAnyHTTPSCertificate:YES forHost:myHost];
Sin embargo, no quiero usar API privadas en una aplicación de producción por razones obvias.
¿Alguna sugerencia sobre qué hacer? ¿Necesito usar las API de CFNetwork? De ser así, tengo dos preguntas:
- ¿Algún código de muestra que pueda usar para comenzar? No he encontrado ninguno en línea.
- Si utilizo CFNetwork para esto, ¿tengo que abandonar NSURL por completo?
EDITAR:
iPhone OS 3.0 introdujo un método compatible para hacer esto. Más detalles aquí: ¿Cómo usar NSURLConnection para conectarse con SSL para un certificado que no es de confianza?
¿Puedes crear un certificado autofirmado y agregar tu autoridad de certificación personalizada a las CA fiables? No estoy muy seguro de cómo funcionaría en el iPhone, pero supongo que en Mac OS X deberías agregarlos al llavero.
También le puede interesar este post Re: Cómo manejar el error de certificado erróneo en NSURLDownload
Si se trata de un servidor interno para fines de prueba, ¿por qué no solo importa el certificado del servidor de prueba en KeyChain y establece la configuración de confianza personalizada?
La forma admitida de hacerlo requiere el uso de CFNetwork. Tienes que hacer es adjuntar un kCFStreamPropertySSLSettings a la corriente que especifica kCFStreamSSLValidatesCertificateChain == kCFBooleanFalse. A continuación se muestra un código rápido que lo hace, menos la comprobación de resultados válidos y la limpieza. Una vez que haya hecho esto, puede usar CFReadStreamRead () para obtener los datos.
CFURLRef myURL = CFURLCreateWithString(kCFAllocatorDefault, CFSTR("http://www.apple.com"), NULL);
CFHTTPMessageRef myRequest = CFHTTPMessageCreateRequest(kCFAllocatorDefault, CFSTR("GET"), myURL, kCFHTTPVersion1_1);
CFReadStreamRef myStream = CFReadStreamCreateForHTTPRequest(kCFAllocatorDefault, myRequest);
CFMutableDictionaryRef myDict = CFDictionaryCreateMutable(kCFAllocatorDefault, 0, &kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks);
CFDictionarySetValue(myDict, kCFStreamSSLValidatesCertificateChain, kCFBooleanFalse);
CFReadStreamSetProperty(myStream, kCFStreamPropertySSLSettings, myDict);
CFReadStreamOpen(myStream);
Otra opción sería usar una biblioteca de conexión alternativa.
Soy un gran fan de AsyncSocket y tiene soporte para certs auto firmados
http://code.google.com/p/cocoaasyncsocket/
Echa un vistazo, creo que es mucho más robusto que las peticiones NSURL estándar.
iPhone OS 3.0 introdujo una forma compatible de hacer esto que no requiere las API CFNetwork de nivel inferior. Más detalles aquí:
¿Cómo usar NSURLConnection para conectarse con SSL para un certificado que no es de confianza?