Pregunta

Usando NSURLSolicitud, Estoy intentando acceder a un sitio web que tiene un certificado caducado.Cuando envío la solicitud, mi conexión: didFailWithError El método delegado 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 utilizar API privadas en una aplicación de producción por razones obvias.

¿Alguna sugerencia sobre qué hacer?¿Necesito usar las API de CFNetwork? Si es así, dos preguntas:

  • ¿Algún código de muestra que pueda usar para comenzar?No he encontrado ninguno en línea.
  • Si uso CFNetwork para esto, ¿tengo que deshacerme de NSURL por completo?

EDITAR:

iPhone OS 3.0 introdujo un método compatible para hacer esto.Más detalles aquí: ¿Cómo utilizar NSURLConnection para conectarse con SSL para un certificado que no es de confianza?

¿Fue útil?

Solución 3

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 utilizar NSURLConnection para conectarse con SSL para un certificado que no es de confianza?

Otros consejos

La forma compatible de hacer esto requiere el uso de CFNetwork.Lo que debe hacer es adjuntar un kCFStreamPropertySSLSettings a la secuencia que especifica kCFStreamSSLValidatesCertificateChain == kCFBooleanFalse.A continuación se muestra un código rápido que lo hace, sin verificar resultados válidos y agregar 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);

Si es para un servidor interno con fines de prueba, ¿por qué no simplemente importar el certificado del servidor de prueba al KeyChain y establecer configuraciones de confianza personalizadas?

Tuve 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 usando ese método, ya que no estaba usando NSURL, sino los métodos WS (pobremente documentados y aparentemente abandonados), y decidí por el momento (internamente) simplemente usar un no-SSL. conexión.

Dicho esto, sin embargo, la pregunta que me viene a la mente es: si no está dispuesto a utilizar una API privada en una aplicación de producción, ¿debería permitir el acceso a un sitio con un certificado poco fiable?

voy a citar Jens Alfke:

Ese no es sólo un problema de seguridad teórico.Algo
Alrededor del 25% de los servidores DNS públicos se han visto comprometidos, según
informes recientes y puede dirigir a los usuarios a sitios de phishing/malware/publicidad incluso
si ingresan el nombre de dominio correctamente.Lo único que te protege
de ahí está la verificación del certificado SSL.

¿Puede crear un certificado autofirmado y agregar su autoridad de certificación personalizada a las CA confiables?No estoy muy seguro de cómo funcionaría esto en el iPhone, pero supongo que en Mac OS X los agregarías al Llavero.

También te puede interesar este post Re:Cómo manejar el error de certificado incorrecto en NSURLDownload

Otra opción sería utilizar una biblioteca de conexiones alternativa.

Soy un gran admirador de AsyncSocket y admite certificados autofirmados.

http://code.google.com/p/cocoaasyncsocket/

Eche un vistazo, creo que es mucho más sólido que el NSURLRequests estándar.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top