¿Cómo cargo una URL HTTP con App Transport Security habilitada en iOS 9? [duplicar]

Resuelto Graeme Mathieson asked hace 54 años • 8 respuestas

Entonces, el nuevo SDK beta de iOS lanzado anoche tiene "App Transport Security" que anima a los desarrolladores a utilizar https en lugar de http. En principio, esta es una gran idea y ya uso https en nuestros entornos de ensayo/producción. Sin embargo, no tengo https configurado en mi entorno de desarrollo local cuando la aplicación de iOS se conecta a un servicio web que estoy ejecutando en mi computadora portátil.

Después de jugar un poco esta mañana, parece que el sistema de carga de URL, incluso si le entrega una URL http, decidirá usar https en su lugar. ¿Alguien sabe cómo deshabilitar este comportamiento, incluso solo para URL específicas?

Graeme Mathieson avatar Jan 01 '70 08:01 Graeme Mathieson
Aceptado

Consulte la referencia Info.plist de Apple para obtener todos los detalles (gracias @gnasher729).

Puede agregar excepciones para dominios específicos en su Info.plist:

<key>NSAppTransportSecurity</key>
<dict>
    <key>NSExceptionDomains</key>
    <dict>
        <key>testdomain.com</key>
        <dict>
            <key>NSIncludesSubdomains</key>
            <true/>
            <key>NSExceptionAllowsInsecureHTTPLoads</key>
            <true/>
            <key>NSExceptionRequiresForwardSecrecy</key>
            <true/>
            <key>NSExceptionMinimumTLSVersion</key>
            <string>TLSv1.2</string>
            <key>NSThirdPartyExceptionAllowsInsecureHTTPLoads</key>
            <false/>
            <key>NSThirdPartyExceptionRequiresForwardSecrecy</key>
            <true/>
            <key>NSThirdPartyExceptionMinimumTLSVersion</key>
            <string>TLSv1.2</string>
            <key>NSRequiresCertificateTransparency</key>
            <false/>
        </dict>
    </dict>
</dict>

Todas las claves para cada dominio exceptuado son opcionales. El orador no dio más detalles sobre ninguna de las claves, pero creo que todas son razonablemente obvias.

(Fuente: sesión 703 de la WWDC 2015, “Privacidad y su aplicación” , 30:18)

También puedes ignorar todas las restricciones de seguridad del transporte de aplicaciones con una sola clave, si tu aplicación tiene una buena razón para hacerlo:

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

Si su aplicación no tiene una buena razón, puede correr el riesgo de ser rechazada:

Configurar NSAllowsArbitraryLoads en verdadero permitirá que funcione, pero Apple fue muy claro en que tienen la intención de rechazar las aplicaciones que usan este indicador sin un motivo específico. La razón principal que se me ocurre para usar NSAllowsArbitraryLoads sería el contenido creado por el usuario (compartir enlaces, navegador web personalizado, etc.). Y en este caso, Apple todavía espera que incluyas excepciones que apliquen el ATS para las URL que tienes bajo control.

Si necesita acceso a URL específicas que no se ofrecen a través de TLS 1.2, debe escribir excepciones específicas para esos dominios, no usar NSAllowsArbitraryLoads configurado en yes. Puede encontrar más información en la sesión NSURLSesssion WWDC.

Tenga cuidado al compartir la solución NSAllowsArbitraryLoads. No es la solución recomendada por Apple.

— kcharwood (gracias @marco-tolman)

adurdin avatar Jun 09 '2015 12:06 adurdin

Como respuesta aceptada, se proporcionó la información requerida y, para obtener más información sobre el uso y la desactivación de App Transport Security, puede encontrar más información al respecto .

Para excepciones por dominio, agréguelas a Info.plist :

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

Pero ¿qué pasa si no conozco todos los dominios inseguros que necesito utilizar? Utilice la siguiente clave en su Info.plist

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

Para obtener más detalles, puede obtenerlos desde este enlace.

Akshay Sunderwani avatar Jun 10 '2015 08:06 Akshay Sunderwani

Segui esto .

Lo resolví agregando alguna clave en info.plist. Los pasos que seguí son:

  1. Abrí mi info.plistarchivo de Proyectos

  2. Se agregó una clave NSAppTransportSecurityllamada Dictionary.

  3. Se agregó una subclave llamada NSAllowsArbitraryLoadsas Booleany se estableció su valor YEScomo en la siguiente imagen. ingrese la descripción de la imagen aquí

Limpie el proyecto y ahora todo funcionará bien como antes.

Enlace de referencia .

Manab Kumar Mal avatar Sep 28 '2015 07:09 Manab Kumar Mal

Si solo desea deshabilitar la Política de transporte de aplicaciones para servidores de desarrollo locales, las siguientes soluciones funcionan bien. Es útil cuando no es posible o resulta poco práctico configurar HTTPS (por ejemplo, cuando se utiliza el servidor de desarrollo de Google App Engine).

Sin embargo, como han dicho otros, ATP definitivamente no debería desactivarse para aplicaciones de producción.

1) Utilice un plist diferente para depurar

Copie su archivo Plist y NSAllowsArbitraryLoads. Utilice este Plist para depurar.

Depuración de XCode

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

2) Excluir servidores locales

Alternativamente, puede utilizar un único archivo plist y excluir servidores específicos. Sin embargo, no parece que pueda excluir direcciones IP 4 , por lo que es posible que deba usar el nombre del servidor (que se encuentra en Preferencias del sistema -> Compartir o configurado en su DNS local).

<key>NSAppTransportSecurity</key>
<dict>
    <key>NSExceptionDomains</key>
    <dict>
        <key>server.local</key>
        <dict/>
        <key>NSExceptionAllowsInsecureHTTPLoads</key>
        <true/>
    </dict>
</dict>
Ian avatar Sep 24 '2015 14:09 Ian