Error de iOS9 "se ha producido un error SSL y no se puede establecer una conexión segura con el servidor"
ssl-certificate app-transport-security (10)
Desde que actualicé mi proyecto existente con iOS 9, sigo recibiendo el error:
Se produjo un error SSL y no se puede establecer una conexión segura con el servidor.
Aunque permitir cargas arbitrarias (
NSAllowsArbitraryLoads = true
) es una buena solución, no debe deshabilitar por completo ATS, sino habilitar la conexión HTTP que desea permitir:
<key>NSAppTransportSecurity</key>
<dict>
<key>NSExceptionDomains</key>
<dict>
<key>yourserver.com</key>
<dict>
<!--Include to allow subdomains-->
<key>NSIncludesSubdomains</key>
<true/>
<!--Include to allow HTTP requests-->
<key>NSTemporaryExceptionAllowsInsecureHTTPLoads</key>
<true/>
<!--Include to specify minimum TLS version-->
<key>NSTemporaryExceptionMinimumTLSVersion</key>
<string>TLSv1.1</string>
</dict>
</dict>
</dict>
El problema es el certificado SSL en el lado del servidor. O algo está interfiriendo o el certificado no coincide con el servicio. Por ejemplo, cuando un sitio tiene un certificado SSL para www.midominio.com mientras el servicio que utiliza se ejecuta en myservice.mydomain.com. Esa es una máquina diferente.
En mi caso, enfrenté este problema en mi simulador porque la fecha de mi computadora estaba por detrás de la fecha actual. Así que verifique este caso también cuando enfrente un error SSL.
Mi problema fue
NSURLConnection
y eso quedó en desuso en iOS9, así que cambié toda la API a
NSURLSession
y eso solucionó mi problema.
Para iOS9, Apple tomó una decisión radical con iOS 9, deshabilitando todo el tráfico HTTP no seguro de las aplicaciones de iOS, como parte de App Transport Security (ATS) .
Para simplemente deshabilitar ATS, puede seguir estos pasos abriendo Info.plist y agregando las siguientes líneas:
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<true/>
</dict>
Parece que iOS 9.0.2 rompe las solicitudes a puntos finales HTTPS válidos. Mi sospecha actual es que requiere certificados SHA-256 o falla con este error.
Para reproducir, inspeccione su UIWebView con safari e intente navegar a un punto final HTTPS arbitrario:
location.href = "https://d37gvrvc0wt4s1.cloudfront.net/js/v1.4/rollbar.min.js"
// [Error] Failed to load resource: An SSL error has occurred and a secure connection to the server cannot be made. (rollbar.min.js, line 0)
Ahora intenta ir a google (porque, por supuesto, tienen un certificado SHA-256):
location.href = "https://google.com"
// no problemo
Agregar una excepción a la seguridad del transporte (como se describe en la respuesta de @ stéphane-bruckert anterior) funciona para solucionar esto.
También supongo que deshabilitar completamente
NSAppTransportSecurity
también funcionaría, aunque he leído que deshabilitarlo por completo puede poner en peligro la revisión de su aplicación.
[EDITAR] He descubierto que simplemente enumerar los dominios a los que me estoy conectando en el dict de
NSExceptionDomains
soluciona este problema, incluso al dejar
NSExceptionAllowsInsecureHTTPLoads
establecido en verdadero.
: /
Proyecto Xcode -> ir a info.plist y hacer clic en el botón + luego Agregar (Configuración de seguridad de transporte de aplicaciones) Expandir, Permitir cargas arbitrarias Establezca SÍ Gracias
Recibo el mismo error cuando especifico mi URL HTTPS como: https://www.mywebsite.com . Sin embargo, funciona bien cuando lo especifico sin las tres W como: https://mywebsite.com .
Si solo está apuntando a dominios específicos, puede intentar agregar esto en la Lista de información de su aplicación:
<key>NSAppTransportSecurity</key>
<dict>
<key>NSExceptionDomains</key>
<dict>
<key>example.com</key>
<dict>
<key>NSExceptionRequiresForwardSecrecy</key>
<false/>
<key>NSIncludesSubdomains</key>
<true/>
</dict>
</dict>
</dict>
iOS 9 fuerza que las conexiones que usan HTTPS sean TLS 1.2 para evitar vulnerabilidades recientes. En iOS 8, incluso las conexiones HTTP sin cifrar eran compatibles, por lo que las versiones anteriores de TLS tampoco causaron ningún problema. Como solución alternativa, puede agregar este fragmento de código a su Info.plist:
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<true/>
</dict>
* referenciado a App Transport Security (ATS)