La security del transporte ha bloqueado un HTTP de text no encryption.

¿Qué configuration necesito poner en mi info.plist para habilitar el modo HTTP según el siguiente post de error?

La security del transporte ha bloqueado una carga de resources HTTP (http: //) de text sin formatting, ya que es insegura. Las excepciones temporales se pueden configurar a través del file 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:

Ingrese la descripción de la imagen aquí

 <key>NSAppTransportSecurity</key> <dict> <key>NSAllowsArbitraryLoads</key> <true/> <key>NSExceptionDomains</key> <dict> <key>example.com</key> <dict> <key>NSExceptionAllowsInsecureHTTPLoads</key> <true/> <key>NSIncludesSubdomains</key> <true/> </dict> </dict> </dict> 

Utilizar:

Ingrese la descripción de la imagen aquí

Debe establecer la key NSAllowsArbitraryLoads en YES en el dictionary NSAppTransportSecurity en su file .plist.

Configuración Plist

Aquí están las configuraciones visualmente:

configuración visual para NSAllowsArbitraryLoads en info.plist mediante Xcode GUI

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

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

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

 <key>NSAppTransportSecurity</key> <dict> <key>NSExceptionDomains</key> <dict> <key>example.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> 

La opción perezosa es:

 <key>NSAppTransportSecurity</key> <dict> <!--Include to allow all connections (DANGER)--> <key>NSAllowsArbitraryLoads</key> <true/> </dict> 

Nota:

info.plist es un file XML por lo que puede colocar este código más o less en cualquier lugar dentro del file.

Esto se probó y estaba funcionando con la semilla GM de iOS 9: esta es la configuration para permitir que un dominio específico use HTTP en lugar de HTTPS:

 <key>NSAppTransportSecurity</key> <dict> <key>NSAllowsArbitraryLoads</key> <false/> <key>NSExceptionDomains</key> <dict> <key>example.com</key> <!--Include your domain at this line --> <dict> <key>NSIncludesSubdomains</key> <true/> <key>NSTemporaryExceptionAllowsInsecureHTTPLoads</key> <true/> <key>NSTemporaryExceptionMinimumTLSVersion</key> <string>TLSv1.1</string> </dict> </dict> </dict> 

NSAllowsArbitraryLoads debe ser false , ya que no permite todas las conexiones inseguras, pero la list de excepciones permite la connection a algunos dominios sin HTTPS.

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

 <key>NSAppTransportSecurity</key> <dict> <key>NSAllowsArbitraryLoads</key> <true/> </dict> 

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

NSAllowsArbitraryLoads
Un valor boolean utilizado para deshabilitar la security de transporte de aplicaciones para cualquier dominio que no esté en la list en el dictionary NSExceptionDomains. Los dominios listdos usan las configuraciones especificadas para ese dominio.

El valor pnetworkingeterminado de NO requiere el comportamiento pnetworkingeterminado de security de transporte de aplicaciones para todas las conexiones.

Realmente recomiendo enlaces:

  • Nota técnica de Apple
  • La session 706 de WWDC 2015 (Seguridad y sus aplicaciones) comienza alnetworkingedor de 1:50
  • Sesión 711 de WWDC 2015 (en networking con NSURLSession)
  • Publicación de blog Envío de una aplicación con security de transporte de aplicaciones

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

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

 <key>NSAppTransportSecurity</key> <dict> <key>NSAllowsArbitraryLoads</key> <false/> <key>NSExceptionDomains</key> <dict> <key>PAGE_FOR_WHICH_SETTINGS_YOU_WANT_TO_OVERRIDE</key> <dict> <key>NSExceptionAllowsInsecureHTTPLoads</key> <true/> </dict> </dict> </dict> 

rechace 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:

 <key>NSIncludesSubdomains</key> <true/> 

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

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

Para lectores interesados

Para aquellos de ustedes que desean un context más sobre por qué sucede esto, además de cómo solucionarlo, lea a continuación.

Con la introducción de iOS 9, para mejorar la security de las conexiones entre una aplicación y web services, las conexiones seguras entre una aplicación y su service web deben seguir las mejores prácticas . El comportamiento de las mejores prácticas se ve reforzado por la security del transporte de la aplicación para:

  • prevenir la divulgación accidental, y
  • Proporciona un comportamiento pnetworkingeterminado que es seguro.

Como se explica en el Technote de security de transporte de la aplicación , al comunicarse con su service web, App Transport Security ahora tiene los siguientes requisitos y comportamiento:

  • El server debe admitir al less la versión 1.2 del protocolo de security de capa de transporte (TLS).
  • Los encryptions de connection están limitados a aquellos que brindan confidencialidad (consulte la list de encryptions a continuación).
  • Los certificates deben firmarse utilizando un algorithm hash SHA256 o superior, con una key RSA de 2048 bits o superior o una key de curva elíptica (ECC) de 256 bits o superior.
  • Los certificates no válidos provocan una falla grave y no tienen connection.

En otras palabras, su request de service web debería: a.) Utilizar HTTPS y b.) Ser encriptada usando TLS v1.2 con secreto hacia adelante.

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


Para anular, deberá agregar las properties del dictionary NSAppTransportSecurity > NSExceptionDomains a su Info.plist . A continuación, agregará el dominio de su service web al dictionary NSExceptionDomains .

Por ejemplo, si quiero omitir el comportamiento de la security de transporte de la aplicación para un service web en el host http://www.yourwebservicehost.com , haría lo siguiente:

  1. Abre tu aplicación en Xcode.

  2. Busque el file Info.plist en Project Navigator y click el button derecho del mouse sobre él y elija la opción de menu Abrir como > Código fuente . El file de la list de properties aparecerá en el panel derecho.

  3. Coloque el siguiente bloque de properties dentro del dictionary de properties principal (bajo el primer <dict> ).


 <key>NSAppTransportSecurity</key> <dict> <key>NSExceptionDomains</key> <dict> <key>www.example.com</key> <dict> <key>NSExceptionAllowsInsecureHTTPLoads</key> <true/> <key>NSExceptionMinimumTLSVersion</key> <string>TLSv1.1</string> <key>NSIncludesSubdomains</key> <true/> </dict> </dict> </dict> 

Si necesita proporcionar excepciones para dominios adicionales, entonces agregaría otra propiedad de dictionary debajo de NSExceptionDomains .

Para get más información sobre las keys a las que se hace reference anteriormente, lea esta nota técnica ya mencionada .

No me gusta editar el plist directamente. Puede agregarlo fácilmente a la list utilizando la GUI:

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

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

Ejemplo

Apple Document 1

Apple Document 2

Hay dos soluciones para esto:

Soluciones 1:

  1. En el file Info.plist , agregue un dictionary con la key ' NSAppTransportSecurity '
  2. Agregue otro elemento dentro del dictionary con la tecla 'Allow Arbitrary Loads'

Plist estructura del Plist debe aparecer como se muestra en la siguiente image.

Solución 1

Solución 2:

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

Plist estructura del Plist debe aparecer como se muestra en la siguiente image.

Solución 2

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

La security 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 security de transporte de aplicaciones ha bloqueado una carga de resources HTTP (http: //) de text sin formatting, ya que es insegura. Las excepciones temporales se pueden configurar a través del file Info.plist de su aplicación.

Al agregar lo siguiente a su Info.plist, se deshabilitará ATS:

 <key>NSAppTransportSecurity</key> <dict> <key>NSAllowsArbitraryLoads</key><true/> </dict> 

Averiguar qué configuraciones usar puede realizarse automáticamente, como se menciona en esta nota técnica :

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

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 puedan hacer a través de HTTP en lugar de HTTPS . Funciona en Xcode 7.1.1.

Ingrese la descripción de la imagen aquí

Utilizar:

PList Captura de pantalla para entender mejor

Agregue un nuevo elemento, NSAppTransportSecurity , en el file Plist con el tipo Dictionary , luego agregue el elemento secundario NSAllowsArbitraryLoads en el dictionary de tipo Boolean y establezca el valor bool YES . Esto funciona para mí.

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

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

Primero,

 <key>NSAppTransportSecurity</key> <dict> <key>NSExceptionDomains</key> <dict> <key>www.xxx.yyy.zzz</key> <dict> <key>NSTemporaryExceptionAllowsInsecureHTTPLoads</key> <true/> <key>NSTemporaryExceptionMinimumTLSVersion</key> <string>TLSv1.1</string> <key>NSIncludesSubdomains</key> <true/> </dict> </dict> </dict> 

Y segundo,

 <key>NSAppTransportSecurity</key> <dict> <key>NSExceptionDomains</key> <dict> <key>www.xxx.yyy.zzz</key> <dict> <key>NSExceptionAllowsInsecureHTTPLoads</key> <true/> <key>NSExceptionMinimumTLSVersion</key> <string>TLSv1.1</string> <key>NSIncludesSubdomains</key> <true/> </dict> </dict> </dict> 

Finalmente, utilicé el método perezoso:

 <key>NSAppTransportSecurity</key> <dict> <key>NSAllowsArbitraryLoads</key> <true/> </dict> 

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

Ve a tu Info.plist

  1. Haga clic derecho en el espacio vacío y click Agregar fila.
  2. Escriba el nombre de key como NSAppTransportSecurity, debajo de él
  3. Seleccione Dominios de exception, agregue un elemento nuevo a este
  4. Anota el nombre de tu dominio al que debes acceder
  5. Cambie el tipo de dominio de la cadena al dictionary, agregue un nuevo elemento
  6. NSTemporaryExceptionAllowsInsecureHTTPLoads, que será un boolean con un valor verdadero. Mira la foto para seguirla correctamente.

NOTA: El dominio de exception en su plist debe estar en LOWER-CASE.

Ejemplo: ha llamado su máquina "MyAwesomeMacbook" en Configuración-> Compartir; su server (para propósitos de testing) se está ejecutando en MyAwesomeMacbook.local: 3000, y su aplicación necesita enviar una request a http: //MyAwesomeMacbook.local: 3000 / files …, en su caso necesitará especificar "myawesomemacbook. local "como el dominio de exception.

Tu info.plist contendría …

 <key>NSAppTransportSecurity</key> <dict> <key>NSExceptionDomains</key> <dict> <key>myawesomemacbook.local</key> <dict> <!--Include to allow subdomains--> <key>NSIncludesSubdomains</key> <true/> <!--Include to allow HTTP requests--> <key>NSExceptionAllowsInsecureHTTPLoads</key> <true/> </dict> </dict> </dict> 

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

El nuevo valor en Info.plist es "Configuración de security de transporte de aplicaciones". A partir de ahí, este dictionary debe contener:

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

Tal vez valga la pena mencionar cómo llegar …

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

Cuando hace clic en él la primera vez, generalmente está en formatting de tabla, por lo que haga clic derecho en el file y 'abrir como' Código fuente y luego agregue el código a continuación hacia el final, es decir:

  <key>NSAppTransportSecurity</key><dict><key>NSAllowsArbitraryLoads</key><true/></dict> 

Copie y pegue el código justo arriba.

  "</dict> </plist>" 

que es al final

De acuerdo con Apple, generalmente desactivar ATS provocará el rechazo de la aplicación, a less 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 le dice exactamente qué configuraciones usar: En Terminal, ingrese

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

y nscurl comprobará si esta request falla, y luego testing una variedad de configuraciones y te dice exactamente cuál pasa y qué hacer. Por ejemplo, para alguna URL de terceros que visito, este command me dijo que este dictionary pasa:

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

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

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

 "NSAppTransportSecurity": [ { "xml": "<dict><key>NSAllowsArbitraryLoads</key><true /></dict>" } ] 

Y debería estar dentro de:

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

El uso de NSExceptionDomains puede no aplicar un efecto de forma simultánea debido a que el sitio de destino puede cargar resources (por ejemplo, files js ) desde dominios externos a través de http . Se puede resolver añadiendo estos dominios externos a NSExceptionDomains también.

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

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

Si toda la ciencia espacial no funciona para ti, comtesting lo obvio: la configuration de la caja de arena

configuración de sandbox]

Siendo nuevo en swift y cocoa, pero bastante experimentado en progtwigción, he pasado unas 20 horas para encontrar esta solución. Ninguno de docenas de hipster-iOS-tutoriales ni notas de keyboard de Apple – nada menciona esta pequeña checkbox.

Como muchos han observado, este es un problema de características que viene con iOS 9.0. Han agregado algo llamado App Transport Security, y yo también estaba molesto cuando rompió mis aplicaciones.

Puede vendarlo con la key NSAllowsArbitraryLoads a YES en el dictionary NSAppTransportSecurity en su file .plist, pero en última instancia tendrá que volver a escribir el código que forma sus URL para formar el prefijo HTTPS: //.

Apple ha reescrito la class NSUrlConnection en iOS 9.0. Puedes leerlo en NSURLConnection .

De lo contrario, es posible que tenga que retroceder de iOS 9.0 hasta que tenga time para implementar la solución correcta.