¿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.
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:
NSAppTransportSecurity NSAllowsArbitraryLoads NSExceptionDomains example.com NSExceptionAllowsInsecureHTTPLoads NSIncludesSubdomains
Utilizar:
Debe establecer la clave NSAllowsArbitraryLoads en SÍ en el diccionario NSAppTransportSecurity en su archivo .plist.
Aquí están las configuraciones visualmente:
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
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:
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:
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:
Abra su aplicación en Xcode.
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.
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:
Ahora cambie los datos en el área principal:
Add Row
Hay dos soluciones para esto:
Soluciones 1:
Info.plist
, agregue un diccionario con la clave ‘ NSAppTransportSecurity
‘ 'Allow Arbitrary Loads'
Plist
estructura de Plist
debe aparecer como se muestra en la imagen de abajo.
Solución 2:
Info.plist
, agregue un diccionario con la clave ‘ NSAppTransportSecurity
‘ NSExceptionDomains
‘ 'MyDomainName.com'
de tipo NSDictionary NSIncludesSubdomains
‘ de tipo Boolean
y valor establecido como YES
NSTemporaryExceptionAllowsInsecureHTTPLoads
‘ de tipo Boolean
y el valor establecido como YES
Plist
estructura de Plist
debe aparecer como se muestra en la imagen de abajo.
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
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.
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
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:
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 SÍ . 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:
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:
NSAppTransportSecurity NSAllowsArbitraryLoads
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
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.