Seguridad de transporte de aplicaciones en Xamarin.iOS
App Transport Security (ATS) exige conexiones seguras entre los recursos de Internet (como el servidor back-end de la aplicación) y la aplicación.
En este artículo se presentan los cambios de seguridad que aplica Seguridad de transporte de aplicaciones en una aplicación de iOS 9 y lo que esto significa para los proyectos de Xamarin.iOS,se tratarán las opciones de configuración de ATS y se explica cómo no participar en ATS 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 la haya permitido explícitamente).
Acerca de la seguridad de transporte de aplicaciones
Como se indicó anteriormente, ATS garantiza que todas las comunicaciones de Internet de iOS 9 y OS X El Capitan se ajustan a los procedimientos recomendados de conexión segura, lo que impide la divulgación accidental de información confidencial directamente a través de la aplicación o una biblioteca que está consumiendo.
En el caso de las aplicaciones existentes, HTTPS implemente el protocolo 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 hacia delante.
Cualquier conexión realizada con NSUrlConnection, CFUrl o NSUrlSession usará ATS de forma predeterminada en las aplicaciones creadas para iOS 9 y OS X 10.11 (El Capitan).
Comportamiento predeterminado de ATS
Puesto 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 usen 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 confidencialidad directa. Consulte la lista de cifrados aceptados a continuación.
- El protocolo seguridad de la capa de transporte (TLS) debe ser la versión 1.2 o superior.
- Se debe usar al menos una huella digital SHA256 con una clave RSA de 2048 bits o superior, o una clave Elliptic-Curve (ECC) de 256 bits o superior 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 de Internet protegidas por ATS aceptan el siguiente tipo de cifrado de confidencialidad directa:
TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHATLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHATLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256TLS_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, vea Referencia de clase NSURLConnectionde Apple, Referencia de CFURL o Referencia de clase NSURLSession deApple.
Compatibilidad con ATS en Xamarin.iOS
Dado que 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 usa establece conexión a Internet, deberá realizar alguna acción o las conexiones producirán una excepción.
En el caso de una aplicación existente, Apple sugiere que admita el HTTPS protocolo lo antes posible. Si no puede porque se está conectando a un servicio web de terceros que no es compatible o si la compatibilidad sería poco práctica, puede optar por no participar en HTTPSHTTPS ATS. Consulte la sección Opting-Out of ATS (No participar en ATS) a continuación para obtener más detalles.
Para una nueva aplicación xamarin.iOS, debe usar exclusivamente al HTTPS comunicarse con recursos de Internet. De nuevo, puede haber situaciones (como el uso de un servicio web de terceros) en las que esto no es posible y deberá rechazar ATS.
Además, ATS exige que la comunicación de API de alto nivel se cifra mediante tls versión 1.2 con confidencialidad hacia delante. Consulte las secciones anteriores Requisitos de conexión ats y cifrados compatibles con ATS para obtener más detalles.
Aunque es posible que no esté familiarizado con TLS(Seguridadde la capa de transporte), es el sucesor de SSL (Capa desocketsseguros) y proporciona una colección de protocolos criptográficos para aplicar la seguridad a través de las conexiones de red.
El nivel tls está controlado por el servicio web que está consumiendo y, por tanto, está fuera del control de la aplicación. y deben usar automáticamente el nivel HttpClient más alto de cifrado TLS admitido por el ModernHttpClient servidor.
Dependiendo del servidor con el que se esté hablando (especialmente si es un servicio de terceros), es posible que tenga que deshabilitar la confidencialidad hacia delante o seleccionar un nivel inferior de TLS. Consulte la sección Configuración de opciones de ATS a continuación para obtener más detalles.
Importante
App Transport Security no se aplica a las aplicaciones de Xamarin mediante implementaciones httpclient administradas. Se aplica a las conexiones que usan implementaciones DE HTTPClient de CFNetwork o implementaciones de HTTPClient de NSURLSession únicamente.
Establecimiento de la implementación de HTTPClient
Para establecer la implementación de HTTPClient usada por una aplicación de iOS, haga doble clic en el Project en el Explorador de soluciones para abrir el Project opciones. Vaya a Compilación de iOS y seleccione el tipo de cliente deseado en la lista desplegable Implementación de HttpClient:

Controlador administrado
El controlador administrado es el controlador HttpClient totalmente administrado que se ha incluido con versiones anteriores de Xamarin.iOS y es el controlador predeterminado.
Ventajas:
- Es la versión más compatible con Microsoft .NET y versiones anteriores de Xamarin.
Inconvenientes:
- No está totalmente integrado con iOS (por ejemplo, está limitado 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 CFNetwork
El controlador basado en CFNetwork se basa en el marco CFNetwork nativo.
Ventajas:
- Usa la API nativa para mejorar el rendimiento y tamaños de archivo ejecutable más pequeños.
- Agrega compatibilidad con estándares más recientes, como TLS 1.2.
Inconvenientes:
- Requiere iOS 6 o posterior.
- No está disponible en watchOS.
- Algunas características y opciones de HttpClient no están disponibles.
Controlador NSUrlSession
El controlador basado en NSUrlSession se basa en la NSUrlSession API nativa.
Ventajas:
- Usa la API nativa para mejorar el rendimiento y tamaños de archivo ejecutable más pequeños.
- Agrega compatibilidad con estándares más recientes, como TLS 1.2.
Inconvenientes:
- Requiere iOS 7 o posterior.
- Algunas características y 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 en el formulario:
App Transport Security ha bloqueado una carga de recursos HTTP ( ) de texto no
http://www.-the-blocked-domain.comcifrado, 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 la aplicación. Además, ATS requiere que la comunicación mediante el protocolo y la comunicación de API de alto nivel se cifran mediante TLS versión HTTPS 1.2 con confidencialidad hacia delante.
Puesto 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 usen o estarán sujetas a requisitos de seguridad de NSURLConnectionCFURLNSURLSession 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 transcodificar opcionalmente en Xamarin y C#) y usarse para diagnosticar problemas de ATS/TLS. Consulte la sección Opting-Out of ATS (No participar en ATS) a continuación para obtener información sobre cómo resolver este problema.
Configuración de 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 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 ( ): contiene todas las claves de configuración y los valores de ATS.
- NSAllowsArbitraryLoads ( ) : si ATS se deshabilitará para cualquier dominio que no
YESaparezca enYESNSExceptionDomains. Para los dominios enumerados, se usará la configuración de seguridad especificada. - NSAllowsArbitraryLoadsInWebContent ( ): si permitirá que las páginas web se carguen correctamente mientras la protección de Seguridad de transporte de Apple (ATS) todavía está habilitada para el resto de la
YESaplicación. - NSExceptionDomains ( ): colección de dominios que y la configuración de seguridad que ATS debe usar para un dominio determinado.
- domain-name-for-exception-as-string > ( ): colección de
Dictionaryexcepciones para un dominio determinado (por ejemplo,www.xamarin.com). - NSExceptionMinimumTLSVersion ( ): la versión mínima de TLS como
TLSv1.0, oTLSv1.1TLSv1.2(que es el valor predeterminado). - NSExceptionRequiresForwardSe secret ( ): si el dominio no tiene que usar un cifrado con seguridad de
NOreenvío. El valor predeterminado esYES. - NSExceptionAllowsInsecureHTTPLoads ( ) : si (valor predeterminado) todas las comunicaciones con este dominio deben estar en el
NOHTTPSprotocolo. - NSRequiresCertificateTransparency ( ): si el Capa de sockets seguros dominio (SSL) debe incluir datos de
YEStransparencia válidos. El valor predeterminado esNO. - NSIncludesSubdomains ( ): si esta configuración invalida todos los
YESsubdominios de este dominio. El valor predeterminado esNO. - NSThirdPartyExceptionMinimumTLSVersion ( ): la versión de TLS que se usa cuando el dominio es un servicio de terceros fuera del control del desarrollador.
- NSThirdPartyExceptionRequiresForwardSecrecy ( ): si un dominio de terceros requiere confidencialidad
YESde reenvío. - NSThirdPartyExceptionAllowsInsecureHTTPLoads ( ): si el ATS permitirá la comunicación no segura con dominios de
YESterceros.
Opting-Out de ATS
Aunque Apple sugiere encarecidamente el uso del protocolo y la comunicación segura con la información basada en Internet, puede haber ocasiones en las que esto HTTPS 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 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 APLICA ATS 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>
Dentro Visual Studio para Mac, haga doble clic en el archivo de la Explorador de soluciones , cambie a la vista Origen y Info.plist agregue las claves anteriores: Info.plist
Si la aplicación necesita cargar y mostrar contenido web desde sitios no seguros, agregue lo siguiente al archivo Info.plist de la aplicación para permitir que las páginas web se carguen correctamente mientras la protección de Seguridad de transporte de Apple (ATS) sigue habilitada para el resto de la aplicación:
<key>NSAppTransportSecurity</key>
<dict>
<key> NSAllowsArbitraryLoadsInWebContent</key>
<true/>
</dict>
Opcionalmente, puede 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 de Internet:
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<true/>
</dict>
Dentro Visual Studio para Mac, haga doble clic en el archivo de la Explorador de soluciones , cambie a la vista Origen y Info.plist agregue las claves anteriores: Info.plist
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 en lugar de desactivar ATS completamente mediante NSAllowsArbitraryLoads . NSAllowsArbitraryLoads solo se debe usar en situaciones de emergencia extremas.
De nuevo, la deshabilitación de ATS solo debe usarse como último recurso, si el cambio 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 exige comunicaciones seguras con Internet. En primer lugar, hemos abordado los cambios que ATS requiere para una aplicación xamarin.iOS que se ejecuta en iOS 9. A continuación, hemos abordado el control de las características y opciones de ATS. Por último, hemos abordado la exclusión de ATS en la aplicación xamarin.iOS.

