iOS9 recibe el error "se ha producido un error de SSL y no se puede establecer una conexión segura con el servidor"

Respuestas:

123

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>
Tony TRAN
fuente
45
Agregué las líneas anteriores en plist, pero sigo recibiendo el siguiente error: Se ha producido un error de SSL y no se puede establecer una conexión segura con el servidor. NSLocalizedRecoverySuggestion = ¿Le gustaría conectarse al servidor de todos modos ?, _kCFNetworkCFStreamSSLErrorOriginalValue = -9819 Estoy llamando a la solicitud HTTPS. ¿Existe alguna otra opción para HTTPS?
AiOsN
1
AiOsN = mismo problema aquí, ¿encontraste una solución?
Franck
5
Parece ser una mala interpretación común que NSAllowsArbitraryLoads es un interruptor para habilitar o deshabilitar ATS. Tan pronto como realice una solicitud https: //, debe asegurarse de cumplir con los requisitos de ATS: un certificado válido instalado en el servidor (sin comodín, que coincida exactamente con el nombre de dominio del servidor), el servidor admite TLS 1.2 con reenvío secreto.
Christian
@Christian ¿Cuál es la fuente de estos requisitos ATS? No puedo encontrar nada sobre no admitir certificados comodín.
Bart
@Bartosz Lo siento, no puedo señalarle un documento oficial, es solo algo que hemos observado al actualizar nuestra infraestructura de servidor.
Christian
64

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>
Stéphane Bruckert
fuente
2
Mucho mejor que ignorar todos los problemas de seguridad. El servicio S3 de Amazon utiliza un cifrado débil y la carga directamente en sus servidores estaba causando problemas, pero esto nos permitió abrir solo la URL s3.amazonaws.com, manteniendo el resto en línea. ¡Increíble!
mix3d
3
El servidor al que intentaba llegar usaba TLSv1.0. Tuve que agregar NSExceptionMinimumTLSVersion para tls1.0 para evitar el error SLL
Ispas Claudiu
Esta respuesta funcionó para mí. Estaba usando un WKWebView e intentaba realizar una solicitud SSL al servidor API.
Fan Jin
Hola @ Stéphane, tengo una situación extraña. Mi teléfono tiene la versión 12.1.2 de iOS, pero aparece el error "Se ha producido un error de SSL y no se puede establecer una conexión segura con el servidor". Lo que hice fue actualizar mi archivo plist. La aplicación funciona bien y nuevamente eliminé los cambios que hice en info.plist. Ahora está funcionando bien. Por lo tanto, no puedo encontrar el motivo real de este error. ¿Cualquier sugerencia?
Mansuu ....
@Mansuu .... ¿Intentaste usar TLSv1.0 como se sugiere en los comentarios anteriores?
Stéphane Bruckert
15

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)

ingrese la descripción de la imagen aquí

TechSeeko
fuente
1
Para Swift 4+, Configuración de seguridad de transporte de aplicaciones -> Permitir cargas arbitrarias = SÍ
mehdigriche
14

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>
Nathan Noble
fuente
Esto no funcionó para mí. Sí, puse el dominio correcto para "example.com".
Alyoshak
1
Es un trabajo para mi. cuando hice el ejemplo solo con el "Permitir cargas arbitrarias" funciona pero luego detenido. Cuando utilicé la clave "NSExceptionRequiresForwardSecrecy" -> false y "NSIncludesSubdomains" -> true, funciona perfectamente. ¡Muchas gracias!
linhadiretalipe
1
¡Esto funcionó para mí también! Aunque estoy usando la conexión https, todavía me enfrenté al problema. Actualmente, no hay soporte para 'NSExceptionRequiresForwardSecrecy'. Por lo que leí, no era necesario especificar esto antes, pero parece que ahora también lo han hecho obligatorio. PD: Estaba probando con iOS 10.2.1
Vaibhav Misra
6

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 NSAppTransportSecuritytambié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 NSExceptionDomainsdict soluciona este problema, incluso cuando lo dejo NSExceptionAllowsInsecureHTTPLoadsestablecido en verdadero. : \

steve
fuente
2

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.

Helge Becker
fuente
Estoy gettng el problema con algunas de las URL, pero no a otros en la misma dirección IP (dominio y servidor)
user6631314
0

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

Shanmugasundharam
fuente
@AbdulYasin verifique su plist y verifique que los cambios climáticos estén actualizados o no?
Shanmugasundharam
1
Esta respuesta "relajada" omite totalmente la explicación y los riesgos de seguridad asociados con esta solución.
Manuel
0

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.

Teena nath Paul
fuente
0

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ó.

Naren
fuente
0

Recibía este error para algunas llamadas de red y no para otras. Estaba conectado a una red wifi pública. Ese wifi gratuito parecía manipular ciertas URL y, por lo tanto, el error.

¡Cuando me conecté a LTE, ese error desapareció!

Miel
fuente