Desde que actualicé mi proyecto existente con iOS 9, sigo recibiendo el error:
Se ha producido un error de SSL y no se puede establecer una conexión segura con el servidor.
Desde que actualicé mi proyecto existente con iOS 9, sigo recibiendo el error:
Se ha producido un error de SSL y no se puede establecer una conexión segura con el servidor.
Respuestas:
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 agregue las siguientes líneas:
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<true/>
</dict>
Aunque permitir cargas arbitrarias ( NSAllowsArbitraryLoads = true
) es una buena solución, no debe deshabilitar ATS por completo, 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>
iOS 9 obliga a las conexiones que utilizan HTTPS a ser TLS 1.2 para evitar vulnerabilidades recientes. En iOS 8, incluso se admitían conexiones HTTP sin cifrar, por lo que las versiones anteriores de TLS tampoco presentaban 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)
Si solo está apuntando a dominios específicos, puede intentar agregar esto en el Info.plist 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>
Parece que iOS 9.0.2 rompe las solicitudes de 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 intente 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 anterior de @ stéphane-bruckert) funciona para solucionar este problema. También asumo que la desactivación completa NSAppTransportSecurity
también funcionaría, aunque he leído que desactivarla por completo puede poner en peligro la revisión de la aplicación.
[EDITAR] Descubrí que simplemente enumerar los dominios a los que me estoy conectando en el NSExceptionDomains
dict soluciona este problema, incluso cuando lo dejo NSExceptionAllowsInsecureHTTPLoads
establecido en verdadero. : \
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.mydomain.com mientras que el servicio que usa se ejecuta en myservice.mydomain.com. Esa es una máquina diferente.
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 .
Proyecto Xcode -> goto info.plist y haga clic en el botón + y luego en Agregar (Configuración de seguridad de transporte de la aplicación) Expandir, Permitir cargas arbitrarias Establezca SÍ. Gracias
Mi problema fue NSURLConnection
y eso quedó obsoleto en iOS9, así que cambié toda la API NSURLSession
y eso solucionó mi problema.
En mi caso, enfrenté este problema en mi simulador porque la fecha de mi computadora estaba atrasada con respecto a la fecha actual. Así que verifique este caso también cuando se enfrente a un error de SSL.
Estaba obteniendo un error por debajo de la reproducción
finished with error [-1200] Error Domain=NSURLErrorDomain Code=-1200 "An SSL error has occurred and a secure connection to the server cannot be made." UserInfo={NSErrorFailingURLStringKey=https://remote-abcabc-svc.an.abc.com:1935/abr/_definst_/smil:v2/video/492F2F82592F59EA74ABAA6B9D6E6F42/F6B1BD452132329FBACD32730862CAE0/091EAD80FE9BEDD52A2F33840CA3CBAC.v3.eng.smil/playlist.m3u8, NSLocalizedRecoverySuggestion=Would you like to connect to the server anyway?, _kCFStreamErrorDomainKey=3, _NSURLErrorFailingURLSessionTaskErrorKey=LocalDataTask <692A1174-DA1C-4267-9560-9020A79F8458>.<1>, _NSURLErrorRelatedURLSessionTaskErrorKey=(
"LocalDataTask <692A1174-DA1C-4267-9560-9020A79F8458>
Me aseguré de agregar una entrada en los dominios de excepción en el archivo plist y NSAllowsArbitraryLoads está configurado en verdadero y aún así veo un error.
Entonces me di cuenta de que estoy jugando URL con https y no http.
Configuré la URL del video en http y el problema se resolvió.