App Transport Security en Xamarin.iOS

App Transport Security (ATS) aplica conexiones seguras entre los recursos de Internet (como el servidor back-end de la aplicación) y su aplicación.

En este artículo se presentan los cambios de seguridad que aplica App Transport Security en una aplicación de iOS 9 y lo que esto significa para los proyectos de Xamarin.iOS, se tratan las opciones de configuración de ATS y se trata cómo rechazar ATS, si es necesario. Dado que ATS está habilitado de forma predeterminada, las conexiones a Internet no seguras producirán una excepción en las aplicaciones de iOS 9 (a menos que se lo haya permitido explícitamente).

Acerca de App Transport Security

Como se ha indicado anteriormente, ATS garantiza que todas las comunicaciones de Internet en iOS 9 y OS X El Capitan se ajustan a los procedimientos recomendados de conexión segura, lo que evita la divulgación accidental de información confidencial directamente desde la aplicación o desde una biblioteca que consuma.

En el caso de las aplicaciones existentes, implemente el protocolo HTTPS siempre que sea posible. Para las nuevas aplicaciones de Xamarin.iOS, debe usar HTTPS exclusivamente al comunicarse con recursos de Internet. Además, la comunicación de API de alto nivel debe cifrarse mediante TLS versión 1.2 con confidencialidad directa.

Cualquier conexión realizada con NSUrlConnection, CFUrl o NSUrlSession usará ATS de forma predeterminada en aplicaciones compiladas para iOS 9 y OS X 10.11 (El Capitan).

Comportamiento predeterminado de ATS

Como ATS está habilitado de forma predeterminada en las aplicaciones compiladas para iOS 9 y OS X 10.11 (El Capitan), todas las conexiones que usan NSUrlConnection, CFUrl o NSUrlSession estarán sujetas a los requisitos de seguridad de ATS. Si las conexiones no cumplen estos requisitos, se producirá un error con una excepción.

Requisitos de conexión de ATS

ATS aplicará los siguientes requisitos para todas las conexiones a Internet:

  • Todos los cifrados de conexión deben usar la confidencialidad directa. Consulte la lista de cifrados aceptados a continuación.
  • El protocolo Seguridad de la capa de transporte (TLS) debe ser de la versión 1.2 o posterior.
  • Se debe usar al menos una huella digital SHA256 con una clave RSA de 2048 bits o superior, o una clave de curva elíptica de 256 bits o superior (ECC) para todos los certificados.

De nuevo, dado que ATS está habilitado de forma predeterminada en iOS 9, cualquier intento de realizar una conexión que no cumpla estos requisitos producirá una excepción.

Cifrados compatibles con ATS

Las comunicaciones por Internet protegidas mediante ATS aceptan el siguiente tipo de cifrado de confidencialidad directa:

  • TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384
  • TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256
  • TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384
  • TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA
  • TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256
  • TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA
  • TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384
  • TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
  • TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384
  • TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256
  • TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA

Para obtener más información sobre cómo trabajar con clases de comunicación de Internet de iOS, consulte Referencia de clase NSURLConnection de Apple o Referencia de clase NSURLSession.

Compatibilidad con ATS en Xamarin.iOS

Como ATS está habilitado de forma predeterminada en iOS 9 y OS X El Capitan, si la aplicación Xamarin.iOS, o cualquier biblioteca o servicio que esta use, realiza una conexión a Internet, tendrá que llevar a cabo alguna acción o las conexiones producirán una excepción.

Para una aplicación existente, Apple sugiere que admita el protocolo HTTPS lo antes posible. Si no puede porque se está conectando a un servicio web de terceros que no admite HTTPS o si la compatibilidad con HTTPS no es práctica, puede optar por no participar en ATS. Consulte la sección No participar en ATS a continuación para más información.

En el caso de una nueva aplicación Xamarin.iOS, debe usar HTTPS exclusivamente al comunicarse con recursos de Internet. De nuevo, puede haber situaciones (como el uso de un servicio web de terceros) donde esto no es posible y tendrá que optar por no participar en ATS.

Además, ATS obliga a que la comunicación de API de alto nivel se cifre mediante TLS versión 1.2 con confidencialidad directa. Consulte las secciones Requisitos de conexión de ATS y Cifrados compatibles con ATS anteriores para obtener más detalles.

Aunque es posible que no esté familiarizado con TLS (Seguridad de la capa de transporte), es el protocolo sucesor de SSL (Capa de sockets seguros) y proporciona una colección de protocolos criptográficos para reforzar la seguridad a través de las conexiones de red.

El nivel de TLS se controla mediante el servicio web que está utilizando y, por tanto, está fuera del control de la aplicación. HttpClient y ModernHttpClient deben usar automáticamente el nivel más alto de cifrado TLS que admita el servidor.

En función del servidor al que esté hablando (especialmente si se trata de un servicio de terceros), es posible que tenga que deshabilitar la confidencialidad directa o seleccionar un nivel de TLS inferior. Consulte la sección Configuración de opciones de ATS a continuación para más información.

Importante

App Transport Security no se aplica a las aplicaciones de Xamarin mediante implementaciones HTTPClient administradas. Se aplica solo a las conexiones que usan implementaciones HTTPClient de CFNetwork o implementaciones HTTPClient de NSURLSession.

Establecimiento de la implementación de HTTPClient

Para establecer la implementación HTTPClient usada por una aplicación de iOS, haga doble clic en el proyecto en el Explorador de soluciones para abrir las opciones del proyecto. Vaya a Compilación de iOS y seleccione el tipo de cliente deseado en la lista desplegable Implementación HttpClient:

Establecer las opciones de compilación de iOS

Controlador administrado

El controlador administrado es el controlador HttpClient totalmente administrado que se ha enviado con la versiones anteriores de Xamarin.iOS y es el controlador predeterminado.

Ventajas:

  • Es el más compatible con Microsoft .NET y la versión anterior de Xamarin.

Inconvenientes:

  • No está totalmente integrado con iOS (por ejemplo, se limita a TLS 1.0).
  • Normalmente es mucho más lento que las API nativas.
  • Requiere más código administrado y crea aplicaciones más grandes.

Controlador de CFNetwork

El controlador basado en CFNetwork se basa en el marco nativo CFNetwork.

Ventajas:

  • Usa API nativas para mejorar el rendimiento y tamaños más pequeños del archivo ejecutable.
  • Agrega compatibilidad con estándares más recientes, como TLS 1.2.

Inconvenientes:

  • Requiere iOS 6 o versiones posteriores.
  • No está disponible en watchOS.
  • Algunas características u opciones de HttpClient no están disponibles.

Controlador NSUrlSession

El controlador basado en NSUrlSession se basa en la API nativa NSUrlSession.

Ventajas:

  • Usa API nativas para mejorar el rendimiento y tamaños más pequeños del archivo ejecutable.
  • Agrega compatibilidad con estándares más recientes, como TLS 1.2.

Inconvenientes:

  • Requiere iOS 7 o versiones posteriores.
  • Algunas características u opciones de HttpClient no están disponibles.

Diagnóstico de problemas de ATS

Al intentar conectarse a Internet, ya sea directamente o desde una vista web en iOS 9, es posible que reciba un error parecido a este:

App Transport Security ha bloqueado una carga de recursos HTTP de texto no cifrado (http://www.-the-blocked-domain.com), ya que no es segura. Las excepciones temporales se pueden configurar a través del archivo Info.plist de la aplicación.

En iOS9, App Transport Security (ATS) aplica conexiones seguras entre los recursos de Internet (como el servidor back-end de la aplicación) y su aplicación. Además, ATS requiere la comunicación mediante el protocolo HTTPS y la comunicación de API de alto nivel para cifrarse mediante TLS versión 1.2 con confidencialidad directa.

Dado que ATS está habilitado de forma predeterminada en las aplicaciones creadas para iOS 9 y OS X 10.11 (El Capitan), todas las conexiones que utilicen NSURLConnection, CFURL o NSURLSession estarán sujetas a los requisitos de seguridad de ATS. Si las conexiones no cumplen estos requisitos, se producirá un error con una excepción.

Apple también proporciona la aplicación de ejemplo TLSTool que se puede compilar (u, opcionalmente, transcodificar a Xamarin y C#) y usar para diagnosticar problemas de ATS/TLS. Consulte la sección No participar en ATS a continuación para más información sobre cómo resolver este problema.

Configuración de las opciones de ATS

Puede configurar varias de las características de ATS estableciendo valores para claves específicas en el archivo Info.plist de la aplicación. Las siguientes claves están disponibles para controlar ATS (con aplicación de sangría para mostrar cómo están anidadas):

NSAppTransportSecurity
    NSAllowsArbitraryLoads
    NSAllowsArbitraryLoadsInWebContent
    NSExceptionDomains
    <domain-name-for-exception-as-string>
        NSExceptionMinimumTLSVersion
        NSExceptionRequiresForwardSecrecy
        NSExceptionAllowsInsecureHTTPLoads
        NSRequiresCertificateTransparency
        NSIncludesSubdomains
        NSThirdPartyExceptionMinimumTLSVersion
        NSThirdPartyExceptionRequiresForwardSecrecy
        NSThirdPartyExceptionAllowsInsecureHTTPLoads

Cada clave tiene el siguiente tipo y significado:

  • NSAppTransportSecurity (Dictionary): contiene todas las claves y valores de configuración de ATS.
  • NSAllowsArbitraryLoads (Boolean): si es YES ATS se deshabilitará para cualquier dominio que no aparezca en NSExceptionDomains. En el caso de los dominios de la lista, se usará la configuración de seguridad especificada.
  • NSAllowsArbitraryLoadsInWebContent (Boolean): si es YES permitirá que las páginas web se carguen correctamente aunque la protección de Apple Transport Security (ATS) siga habilitada para el resto de la aplicación.
  • NSExceptionDomains (Dictionary): colección de dominios y la configuración de seguridad que ATS debe usar para un dominio determinado.
  • <domain-name-for-exception-as-string> (Dictionary): colección de excepciones para un dominio determinado (por ejemplo, www.xamarin.com).
  • NSExceptionMinimumTLSVersion (String): versión mínima de TLS como TLSv1.0, TLSv1.1 o TLSv1.2 (que es el valor predeterminado).
  • NSExceptionRequiresForwardSecrecy (Boolean): si es NO el dominio no tiene que usar un cifrado con confidencialidad directa. El valor predeterminado es YES.
  • NSExceptionAllowsInsecureHTTPLoads (Boolean): si es NO (el valor predeterminado) todas las comunicaciones con este dominio deben estar en el protocolo HTTPS.
  • NSRequiresCertificateTransparency (Boolean): si es YES la capa de sockets seguros (SSL) del dominio debe incluir datos de transparencia válidos. El valor predeterminado es NO.
  • NSIncludesSubdomains (Boolean): si es YES esta configuración invalida todos los subdominios de este dominio. El valor predeterminado es NO.
  • NSThirdPartyExceptionMinimumTLSVersion (String): la versión de TLS que se usa cuando el dominio es un servicio de terceros fuera del control del desarrollador.
  • NSThirdPartyExceptionRequiresForwardSecrecy (Boolean): si es YES un dominio de terceros requiere confidencialidad directa.
  • NSThirdPartyExceptionAllowsInsecureHTTPLoads (Boolean): si es YES ATS permitirá la comunicación no segura con dominios de terceros.

No participar en ATS

Aunque Apple recomienda mucho el uso del protocolo HTTPS y la comunicación segura a la información basada en Internet, puede haber ocasiones en que esto no siempre sea posible. Por ejemplo, si se comunica con un servicio web de terceros o usa anuncios entregados por Internet en la aplicación.

Si la aplicación de Xamarin.iOS debe realizar una solicitud a un dominio no seguro, los siguientes cambios en el archivo Info.plist de la aplicación deshabilitarán los valores predeterminados de seguridad que ATS aplica para un dominio determinado:

<key>NSAppTransportSecurity</key>
<dict>
    <key>NSExceptionDomains</key>
    <dict>
        <key>www.the-domain-name.com</key>
        <dict>
            <key>NSExceptionMinimumTLSVersion</key>
            <string>TLSv1.0</string>
            <key>NSExceptionRequiresForwardSecrecy</key>
            <false/>
            <key>NSExceptionAllowsInsecureHTTPLoads</key>
            <true/>
            <key>NSIncludesSubdomains</key>
            <true/>
        </dict>
    </dict>
</dict>

En Visual Studio para Mac, haga doble clic en el archivo Info.plist del Explorador de soluciones, cambie a la vista Origen y agregue las claves anteriores:

Vista de origen del archivo Info.plist después de agregar claves especificadas.

Si la aplicación tiene que cargar y mostrar contenido web de sitios no seguros, agregue lo siguiente al archivo Info.plist de la aplicación para permitir que las páginas web se carguen correctamente aunque Apple Transport Security (ATS) siga habilitado para el resto de la aplicación:

<key>NSAppTransportSecurity</key>
<dict>
    <key> NSAllowsArbitraryLoadsInWebContent</key>
    <true/>
</dict>

Opcionalmente, puedes realizar los siguientes cambios en el archivo Info.plist de la aplicación para deshabilitar completamente ATS para todos los dominios y la comunicación con Internet:

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

En Visual Studio para Mac, haga doble clic en el archivo Info.plist del Explorador de soluciones, cambie a la vista Origen y agregue las claves anteriores:

Vista de origen del archivo Info.plist después de especificar NSAllowsArbitraryLoadsInWebContent y NSAllowsArbitraryLoads.

Importante

Si la aplicación requiere una conexión a un sitio web no seguro, siempre debe escribir el dominio como una excepción mediante NSExceptionDomains en lugar de desactivar ATS completamente mediante NSAllowsArbitraryLoads. NSAllowsArbitraryLoads solo debe utilizarse en situaciones de emergencia extremas.

De nuevo, deshabilitar ATS solo debe usarse como último recurso, si cambiar a conexiones seguras no está disponible o no es práctico.

Resumen

En este artículo se ha presentado App Transport Security (ATS) y se ha descrito la forma en que aplica las comunicaciones seguras con Internet. En primer lugar, se han descrito los cambios necesarios para una aplicación de Xamarin.iOS que se ejecuta en iOS 9. A continuación, se ha tratado el control de las características y opciones de ATS. Por último, hemos tratado sobre la no participación de ATS en la aplicación Xamarin.iOS.