Tengo el siguiente código simple para conectarme a una página web SSL
NSMutableURLRequest *urlRequest=[NSMutableURLRequest requestWithURL:url];
[ NSURLConnection sendSynchronousRequest: urlRequest returningResponse: nil error: &error ];
Excepto que da un error si el certificado es uno autofirmado. Error Domain=NSURLErrorDomain Code=-1202 UserInfo=0xd29930 "untrusted server certificate".
¿Hay alguna forma de configurarlo para que acepte conexiones de todos modos (al igual que en un navegador puede presionar aceptar) o una forma de evitarlo?
-(void)connection:(NSURLConnection *)connection willSendRequestForAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge
método debe usarse en su lugar.Si no está dispuesto (o no puede) usar API privadas, hay una biblioteca de código abierto (licencia BSD) llamada ASIHTTPRequest que proporciona un contenedor alrededor del nivel inferior
CFNetwork APIs
. Recientemente introdujeron la capacidad de permitir elHTTPS connections
uso de certificados autofirmados o no confiables con la-setValidatesSecureCertificate:
API. Si no desea extraer toda la biblioteca, puede usar la fuente como referencia para implementar la misma funcionalidad usted mismo.fuente
Idealmente, solo debería haber dos escenarios en los que una aplicación iOS necesitaría aceptar un certificado no confiable.
Escenario A: está conectado a un entorno de prueba que utiliza un certificado autofirmado.
Escenario B: está enviando
HTTPS
tráfico mediante unMITM Proxy like Burp Suite, Fiddler, OWASP ZAP, etc.
proxy Los proxy devolverán un certificado firmado por una CA autofirmada para que el proxy pueda capturarHTTPS
tráfico.Los hosts de producción nunca deben usar certificados no confiables por razones obvias .
Si necesita que el simulador de iOS acepte un certificado no confiable para fines de prueba, se recomienda encarecidamente que no cambie la lógica de la aplicación para deshabilitar la validación de certificado incorporada proporcionada por el
NSURLConnection
API. Si la aplicación se lanza al público sin eliminar esta lógica, será susceptible a ataques de hombre en el medio.La forma recomendada de aceptar certificados no confiables para fines de prueba es importar el certificado de la Autoridad de certificación (CA) que firmó el certificado en su simulador de iOS o dispositivo iOS. Escribí una publicación rápida en el blog que demuestra cómo hacer esto en un simulador de iOS en:
aceptar certificados no confiables utilizando el simulador ios
fuente
NSURLRequest
tiene un método privado llamadosetAllowsAnyHTTPSCertificate:forHost:
, que hará exactamente lo que quieras. Puede definir elallowsAnyHTTPSCertificateForHost:
método aNSURLRequest
través de una categoría y configurarlo para que regreseYES
para el host que desea anular.fuente
Para complementar la respuesta aceptada, para una seguridad mucho mejor, puede agregar su certificado de servidor o su propio certificado de CA raíz al llavero ( https://stackoverflow.com/a/9941559/1432048 ), sin embargo, hacer esto solo no hará que NSURLConnection autentique su servidor autofirmado automáticamente. Aún necesita agregar el código siguiente a su delegado NSURLConnection, se copia del código de muestra de Apple AdvancedURLConnections , y debe agregar dos archivos (Credentials.h, Credentials.m) del código de muestra de Apple a sus proyectos.
fuente
No puedo tomar ningún crédito por esto, pero este que encontré funcionó muy bien para mis necesidades.
shouldAllowSelfSignedCert
es miBOOL
variable Simplemente agregue a suNSURLConnection
delegado y debería estar listo para un bypass rápido por conexión.fuente
En iOS 9, las conexiones SSL fallarán para todos los certificados no válidos o autofirmados. Este es el comportamiento predeterminado de la nueva función Seguridad de transporte de aplicaciones en iOS 9.0 o posterior, y en OS X 10.11 y posterior.
Puede anular este comportamiento en el
Info.plist
, mediante el establecimientoNSAllowsArbitraryLoads
deYES
en elNSAppTransportSecurity
diccionario. Sin embargo, recomiendo anular esta configuración solo con fines de prueba.Para obtener información, consulte la nota técnica de transporte de aplicaciones aquí .
fuente
La solución alternativa de categoría publicada por Nathan de Vries pasará las verificaciones de API privadas de AppStore, y es útil en casos en los que no tiene control del
NSUrlConnection
objeto. Un ejemplo es elNSXMLParser
que abrirá la URL que proporcione, pero no expone elNSURLRequest
oNSURLConnection
.En iOS 4, la solución aún parece funcionar, pero solo en el dispositivo, el simulador ya no invoca el
allowsAnyHTTPSCertificateForHost:
método.fuente
NSURLConnectionDelegate
Debe usar para permitir conexiones HTTPS y hay nuevas devoluciones de llamada con iOS8.Obsoleto:
En cambio, debes declarar:
Con
willSendRequestForAuthenticationChallenge
usted puede usarchallenge
como lo hizo con los métodos obsoletos, por ejemplo:fuente
Publiqué un código esencial (basado en el trabajo de otra persona que noto) que le permite autenticarse adecuadamente contra un certificado autogenerado (y cómo obtener un certificado gratuito - vea los comentarios al final de Cocoanetics )
Mi código está aquí github
fuente
Si desea seguir usando sendSynchronousRequest, trabajo en esta solución:
Puedes verlo aquí: Objective-C SSL Synchronous Connection
fuente
Con AFNetworking , he consumido con éxito el servicio web https con el siguiente código,
fuente
Puedes usar este Código
Usar en
-connection:willSendRequestForAuthenticationChallenge:
lugar de estos métodos obsoletosObsoleto:
fuente