La seguridad del transporte ha bloqueado un texto claro HTTP

¿Qué configuración debo poner en mi info.plist para habilitar el modo HTTP según el siguiente mensaje de error?

La seguridad de transporte ha bloqueado una carga de recursos HTTP sin cifrar (http: //) ya que es insegura. Las excepciones temporales se pueden configurar a través del archivo Info.plist de su aplicación.

Xcode

Supongamos que mi dominio es example.com .

Si está utilizando Xcode 8.0 y Swift 3.0 o Swift 2.2 o incluso Objective C:

Ingrese la descripción de la imagen aquí

 NSAppTransportSecurity  NSAllowsArbitraryLoads  NSExceptionDomains  example.com  NSExceptionAllowsInsecureHTTPLoads  NSIncludesSubdomains     

Utilizar:

Ingrese la descripción de la imagen aquí

Debe establecer la clave NSAllowsArbitraryLoads en en el diccionario NSAppTransportSecurity en su archivo .plist.

Configuración de lista

Aquí están las configuraciones visualmente:

ajustes visuales para NSAllowsArbitraryLoads en info.plist a través de Xcode GUI

Ver la publicación del foro ¿Seguridad de transporte de aplicaciones? .

También la página Configuración de excepciones de seguridad de transporte de aplicaciones en iOS 9 y OSX 10.11 .

Por ejemplo, puede agregar un dominio específico como:

 NSAppTransportSecurity  NSExceptionDomains  example.com   NSIncludesSubdomains   NSTemporaryExceptionAllowsInsecureHTTPLoads   NSTemporaryExceptionMinimumTLSVersion TLSv1.1    

La opción perezosa es:

 NSAppTransportSecurity   NSAllowsArbitraryLoads   

Nota:

info.plist es un archivo XML para que pueda colocar este código más o menos en cualquier lugar dentro del archivo.

Esto fue probado y estaba trabajando en iOS 9 GM seed: esta es la configuración para permitir que un dominio específico use HTTP en lugar de HTTPS:

 NSAppTransportSecurity  NSAllowsArbitraryLoads  NSExceptionDomains  example.com   NSIncludesSubdomains  NSTemporaryExceptionAllowsInsecureHTTPLoads  NSTemporaryExceptionMinimumTLSVersion TLSv1.1    

NSAllowsArbitraryLoads debe ser false , ya que no permite todas las conexiones no seguras, pero la lista de excepciones permite la conexión a algunos dominios sin HTTPS.

Esta es una solución rápida (pero no recomendada) para agregar esto en el plist:

 NSAppTransportSecurity  NSAllowsArbitraryLoads   

Lo que significa (según la documentación de Apple ):

NSAllowsArbitraryLoads
Un valor booleano utilizado para deshabilitar la seguridad del transporte de aplicaciones para cualquier dominio que no se encuentre en el diccionario NSExceptionDomains. Los dominios listados usan la configuración especificada para ese dominio.

El valor predeterminado de NO requiere el comportamiento predeterminado de Seguridad de transporte de aplicaciones para todas las conexiones.

Realmente recomiendo los enlaces:

  • Nota técnica de Apple
  • La sesión 706 de WWDC (Seguridad y sus aplicaciones) comienza alrededor de 1:50
  • WWDC 2015 session 711 (Networking with NSURLSession)
  • Publicación de blog Envío de una aplicación con seguridad de transporte de aplicaciones

que me ayudan a entender las razones y todas las implicaciones.

El XML (en el archivo Info.plist) a continuación:

 NSAppTransportSecurity  NSAllowsArbitraryLoads  NSExceptionDomains  PAGE_FOR_WHICH_SETTINGS_YOU_WANT_TO_OVERRIDE  NSExceptionAllowsInsecureHTTPLoads     

no permitir llamadas arbitrarias para todas las páginas, pero para PAGE_FOR_WHICH_SETTINGS_YOU_WANT_TO_OVERRIDE permitirá que las conexiones utilicen el protocolo HTTP.

Para el XML anterior, puede agregar:

 NSIncludesSubdomains  

si desea permitir conexiones inseguras para los subdominios de la dirección especificada.

El mejor enfoque es bloquear todas las cargas arbitrarias (establecer en falso) y agregar excepciones para permitir solo las direcciones que sabemos que están bien.

Para lectores interesados

Para aquellos de ustedes que quieren un contexto más amplio sobre por qué está sucediendo esto, además de cómo solucionarlo, entonces lea a continuación.

Con la introducción de iOS 9, para mejorar la seguridad de las conexiones entre una aplicación y los servicios web, las conexiones seguras entre una aplicación y su servicio web deben seguir las mejores prácticas . La App Transport Security impone el comportamiento de las mejores prácticas a:

  • prevenir la divulgación accidental, y
  • proporcionar un comportamiento predeterminado que sea seguro.

Como se explica en la Técnica de seguridad de transporte de aplicaciones , cuando se comunica con su servicio web, App Transport Security ahora tiene los siguientes requisitos y comportamiento:

  • El servidor debe admitir al menos la versión 1.2 del protocolo Transport Layer Security (TLS).
  • Los cifrados de conexión están limitados a aquellos que proporcionan secreto hacia adelante (consulte la lista de cifrados a continuación).
  • Los certificados deben estar firmados con un algoritmo SHA256 o mejor algoritmo hash de firma, con una clave RSA de 2048 bit o superior o una clave de curva elíptica (ECC) de 256 bit o superior.
  • Los certificados no válidos dan como resultado una falla grave y ninguna conexión.

En otras palabras, su solicitud de servicio web debe: a.) Usar HTTPS y b.) Cifrarse utilizando TLS v1.2 con secretividad anticipada.

Sin embargo, como se mencionó en otras publicaciones, puede anular este nuevo comportamiento desde App Transport Security al especificar el dominio inseguro en Info.plist de su aplicación.


Para sobrescribir, deberá agregar las propiedades del diccionario NSAppTransportSecurity > NSExceptionDomains a su Info.plist . A continuación, agregará el dominio de su servicio web al diccionario NSExceptionDomains .

Por ejemplo, si quiero omitir el comportamiento de Seguridad de transporte de aplicaciones para un servicio web en el host http://www.yourwebservicehost.com, entonces haría lo siguiente:

  1. Abra su aplicación en Xcode.

  2. Busque el archivo Info.plist en Project Navigator y haga clic con el botón derecho y elija la opción de menú Abrir como > Código fuente . El archivo de la lista de propiedades aparecerá en el panel derecho.

  3. Coloque el siguiente bloque de propiedades dentro del diccionario de propiedades principales (debajo del primer ).


 NSAppTransportSecurity  NSExceptionDomains  www.example.com  NSExceptionAllowsInsecureHTTPLoads  NSExceptionMinimumTLSVersion TLSv1.1 NSIncludesSubdomains     

Si necesita proporcionar excepciones para dominios adicionales, NSExceptionDomains agregar otra propiedad de diccionario debajo de NSExceptionDomains .

Para obtener más información sobre las claves mencionadas anteriormente, lea esta nota técnica ya mencionada .

No me gusta editar el plist directamente. Puede agregarlo fácilmente al plist usando la GUI:

  • Haga clic en Info.plist en el Navegador de la izquierda.
  • Ahora cambie los datos en el área principal:

    • En la última línea agrega el +
    • Ingrese el nombre del grupo: Configuración de seguridad del transporte de la aplicación
    • Haga clic derecho en el grupo y seleccione Add Row
    • Ingrese Permitir cargas arbitrarias
    • Establezca el valor a la derecha de

Ejemplo

Documento de Apple 1

Documento de Apple 2

Hay dos soluciones para esto:

Soluciones 1:

  1. En el archivo Info.plist , agregue un diccionario con la clave ‘ NSAppTransportSecurity
  2. Agregue otro elemento dentro del diccionario con la clave 'Allow Arbitrary Loads'

Plist estructura de Plist debe aparecer como se muestra en la imagen de abajo.

Solución 1

Solución 2:

  1. En el archivo Info.plist , agregue un diccionario con la clave ‘ NSAppTransportSecurity
  2. Agregue otro elemento dentro del diccionario con la clave ‘ NSExceptionDomains
  3. Agregar elemento con la clave 'MyDomainName.com' de tipo NSDictionary
  4. Agregar elemento con la clave ‘ NSIncludesSubdomains ‘ de tipo Boolean y valor establecido como YES
  5. Agregar elemento con la clave ‘ NSTemporaryExceptionAllowsInsecureHTTPLoads ‘ de tipo Boolean y el valor establecido como YES

Plist estructura de Plist debe aparecer como se muestra en la imagen de abajo.

Solución 2

La solución 2 es preferida ya que solo permite el dominio seleccionado, mientras que la solución 1 permite todas las conexiones HTTP inseguras.

La seguridad del transporte está disponible en iOS 9.0 o posterior. Puede tener esta advertencia cuando intente llamar a un WS dentro de su aplicación:

La Seguridad de transporte de la aplicación ha bloqueado una carga de recursos HTTP sin cifrar (http: //) ya que no es segura. Las excepciones temporales se pueden configurar a través del archivo Info.plist de su aplicación.

Agregar lo siguiente a su Info.plist deshabilitará ATS:

 NSAppTransportSecurity  NSAllowsArbitraryLoads  

Ejemplo de desarrollo

Aquí hay una captura de pantalla de un plist que mantiene ATS intacto (= seguro), pero permite que las conexiones a localhost se realicen a través de HTTP en lugar de HTTPS . Funciona en Xcode 7.1.1.

Ingrese la descripción de la imagen aquí

Averiguar qué configuración utilizar se puede realizar automáticamente, como se menciona en esta nota técnica :

 /usr/bin/nscurl --ats-diagnostics --verbose https://your-domain.com 

Ve a tu Info.plist

  1. Haga clic derecho en el espacio vacío y haga clic en Agregar fila
  2. Escriba el nombre de la clave como NSAppTransportSecurity, Under it
  3. Seleccione Dominios de excepción, Agregue un nuevo elemento a este
  4. Escriba su nombre de dominio al que debe acceder
  5. Cambia el tipo de Dominio de Cadena a Diccionario, agrega un nuevo Artículo
  6. NSTemporaryExceptionAllowsInsecureHTTPLoads, que será un booleano con un valor verdadero. Mire la imagen para seguirla correctamente

Según Apple, generalmente el deshabilitar ATS dará lugar al rechazo de la aplicación, a menos que tenga una buena razón para hacerlo. Incluso entonces, debe agregar excepciones para los dominios a los que puede acceder de forma segura.

Apple tiene una excelente herramienta que te dice exactamente qué ajustes usar: En Terminal, ingresa

 /usr/bin/nscurl --ats-diagnostics --verbose https://www.example.com/whatever 

y nscurl comprobará si esta solicitud falla, y luego probará una variedad de configuraciones y le dirá exactamente cuál pasa, y qué hacer. Por ejemplo, para alguna URL de terceros que visito, este comando me dice que este diccionario pasa:

 { NSExceptionDomains = { "www.example.com" = { NSExceptionRequiresForwardSecrecy = false; }; }; } 

Para distinguir entre sus propios sitios y los sitios de terceros que están fuera de su control, use, por ejemplo, la clave NSThirdPartyExceptionRequiresForwardSecrecy.

Utilizar:

PList Captura de pantalla para comprender mejor

Agregue un nuevo elemento, NSAppTransportSecurity , en el archivo plist con tipo Dictionary , luego agregue el elemento secundario NSAllowsArbitraryLoads en el diccionario de tipo Boolean y establezca el valor bool . Esto funciona para mí

En 2015-09-25 (después de las actualizaciones de Xcode en 2015-09-18):

Usé un método no perezoso, pero no funcionó. Los siguientes son mis bashs.

Primero,

 NSAppTransportSecurity  NSExceptionDomains  www.xxx.yyy.zzz  NSTemporaryExceptionAllowsInsecureHTTPLoads  NSTemporaryExceptionMinimumTLSVersion TLSv1.1 NSIncludesSubdomains     

Y segundo,

 NSAppTransportSecurity  NSExceptionDomains  www.xxx.yyy.zzz  NSExceptionAllowsInsecureHTTPLoads  NSExceptionMinimumTLSVersion TLSv1.1 NSIncludesSubdomains     

Finalmente, utilicé el método perezoso:

 NSAppTransportSecurity  NSAllowsArbitraryLoads   

Puede ser un poco inseguro, pero no pude encontrar otras soluciones.

NOTA: El dominio de excepción en su plist debe estar en LOWER-CASE.

Ejemplo: ha llamado a su máquina “MyAwesomeMacbook” en Configuración-> Compartir; su servidor (para fines de prueba) se ejecuta en MyAwesomeMacbook.local: 3000, y su aplicación debe enviar una solicitud a http: //MyAwesomeMacbook.local: 3000 / files …, su lista deberá especificar “myawesomemacbook”. local “como el dominio de excepción.

Su info.plist contendría …

 NSAppTransportSecurity  NSExceptionDomains  myawesomemacbook.local   NSIncludesSubdomains   NSExceptionAllowsInsecureHTTPLoads     

Actualización para Xcode 7.1, frente al problema 27.10.15:

El nuevo valor en Info.plist es “Configuración de seguridad de transporte de aplicaciones”. A partir de ahí, este diccionario debe contener:

  • Permitir cargas arbitrarias = SÍ
  • Dominios de excepciones (inserte aquí su dominio http)

Puede valer la pena mencionar cómo llegar allí …

Info.plist es uno de los archivos debajo de Main.storyboard o viewController.swift.

Cuando hace clic en él la primera vez, por lo general está en formato de tabla, por lo tanto, haga clic derecho en el archivo y ‘abrir como’ Código fuente y luego agregue el código siguiente hacia el final, es decir:

  NSAppTransportSecurityNSAllowsArbitraryLoads 

Copia y pega el código justo arriba

  " " 

que está al final.

Para aquellos que vinieron aquí tratando de encontrar la razón por la cual su WKWebView siempre es blanco y no carga nada (exactamente como se describe aquí, ¿cómo hago para que WKWebView funcione rápido y para una aplicación macOS )?

Si toda la ciencia de los cohetes anterior no funciona para usted, compruebe lo obvio: la configuración del recinto de seguridad

configuración de sandbox]

Siendo nuevo en swift y cocoa, pero bastante experimentado en progtwigción, he gastado alrededor de 20 horas en encontrar esta solución. Ninguno de los docenas de tutoriales de iOS ni de las notas clave de Apple: nada menciona esta pequeña checkbox.

Para cordova, si desea agregarlo a su ios.json, haga lo siguiente:

 "NSAppTransportSecurity": [ { "xml": "NSAllowsArbitraryLoads" } ] 

Y debe estar dentro de:

 "*-Info.plist": { "parents": { } } 

El uso de NSExceptionDomains puede no aplicar un efecto simultáneamente debido a que el sitio de destino puede cargar recursos (por ejemplo, archivos js ) desde dominios externos a través de http . Se puede resolver agregando estos dominios externos a NSExceptionDomains también.

Para inspeccionar qué recursos no se pueden cargar, intente utilizar la depuración remota. Aquí hay un tutorial: http://geeklearning.io/apache-cordova-and-remote-debugging-on-ios/

Como muchos han notado, este es un problema que viene con iOS 9.0. Han agregado una cosa llamada App Transport Security, y yo también estaba molesto cuando rompió mis aplicaciones.

Puede vendarlo con la clave NSAllowsArbitraryLoads a SÍ bajo el diccionario NSAppTransportSecurity en su archivo .plist, pero en última instancia tendrá que volver a escribir el código que forma sus URL para formar el prefijo HTTPS: //.

Apple ha vuelto a escribir la clase NSUrlConnection en iOS 9.0. Puede leer sobre esto en NSURLConnection .

De lo contrario, es posible que deba abandonar el iOS 9.0 hasta que tenga tiempo de implementar la solución correcta.