Compartir vía


Selector de implementación de HttpClient y SSL/TLS para iOS y macOS

El selector de implementación de HttpClient para Xamarin.iOS, Xamarin.tvOS y Xamarin.Mac controla qué implementación HttpClient se va a usar. Puede cambiar a una implementación que use transportes nativos de iOS, tvOS o macOS (NSUrlSession o CFNetwork, dependiendo del sistema operativo). La ventaja es la compatibilidad con TLS 1.2, archivos binarios más pequeños y descargas más rápidas; la desventaja es que requiere que el bucle de eventos esté en ejecución para que se ejecuten las operaciones asíncronas.

Los proyectos deben hacer referencia al ensamblado System.Net.Http.

Advertencia

Abril de 2018: debido a un aumento de los requisitos de seguridad, incluido el cumplimiento del estándar PCI, se espera que los principales proveedores de nube y los servidores web dejen de admitir versiones de TLS anteriores a la versión 1.2. Los proyectos de Xamarin creados en versiones anteriores de Visual Studio usan de forma predeterminada versiones anteriores de TLS.

Para asegurarse de que las aplicaciones siguen funcionando con estos servidores y servicios, debe actualizar los proyectos de Xamarin con la configuración de NSUrlSession que se muestra a continuación, volver a compilar e implementar las aplicaciones a los usuarios.

Selección de una pila HttpClient

Para ajustar el HttpClient que usa la aplicación:

  1. Haga doble clic en el Nombre del proyecto del Explorador de soluciones para abrir las opciones del proyecto.
  2. Cambie a la configuración de compilación del proyecto (por ejemplo, compilación de iOS para una aplicación de Xamarin.iOS).
  3. En la lista desplegable Implementación de HttpClient, seleccione el tipo HttpClient como uno de los siguientes: NSUrlSession (recomendado), CFNetwork o Administrado.

Choose HttpClient implementation from Managed, CFNetwork, or NSUrlSession

Sugerencia

Para la compatibilidad con TLS 1.2 se recomienda la opción NSUrlSession.

NSUrlSession

El controlador basado en NSURLSession se basa en el marco nativo NSURLSession disponible en iOS 7 y versiones posteriores. Éste es el valor de configuración recomendado.

Ventajas

  • Usa API nativas para mejorar el rendimiento y el tamaño ejecutable más pequeño.
  • Compatibilidad con los estándares más recientes, como TLS 1.2.

Desventajas

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

CFNetwork

El controlador basado en CFNetwork se basa en el marco nativo CFNetwork disponible en iOS 6 y versiones posteriores.

Ventajas

  • Usa API nativas para mejorar el rendimiento y el tamaño ejecutable más pequeño.
  • Compatibilidad con estándares más recientes, como TLS 1.2.

Desventajas

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

Administrado

El controlador administrado es el controlador HttpClient totalmente administrado que se ha enviado con la versión anterior de Xamarin.

Ventajas

  • Tiene el conjunto de características más compatible con Microsoft .NET y versiones anteriores de Xamarin.

Desventajas

  • No está totalmente integrado con los sistemas operativos Apple y está limitado a TLS 1.0. Es posible que no pueda conectarse a servidores web seguros ni a servicios en la nube en el futuro.
  • Normalmente, suele ser mucho más lento en cosas como el cifrado que las API nativas.
  • Requiere más código administrado, lo que crea una aplicación más amplia distribuible.

Configuración mediante programación de HttpMessageHandler

Además de la configuración de todo el proyecto mostrada anteriormente, también puede crear instancias HttpClient e insertar el HttpMessageHandler deseado a través del constructor, como se muestra en estos fragmentos de código:

// This will use the default message handler for the application; as
// set in the Project Options for the project.
HttpClient client = new HttpClient();

// This will create an HttpClient that explicitly uses the CFNetworkHandler
HttpClient client = new HttpClient(new CFNetworkHandler());

// This will create an HttpClient that explicitly uses NSUrlSessionHandler
HttpClient client = new HttpClient(new NSUrlSessionHandler());

Esto permite utilizar un valor HttpMessageHandler diferente del declarado en el cuadro de diálogo Opciones del proyecto.

Implementación de SSL/TLS

SSL (Capa de socket seguro) y su sucesor, TLS (seguridad de la capa de transporte), proporcionan compatibilidad con HTTP y otras conexiones de red a través de System.Net.Security.SslStream. La implementación de System.Net.Security.SslStream de Xamarin.iOS, Xamarin.tvOS o Xamarin.Mac llamará a la implementación nativa de SSL/TLS de Apple en lugar de usar la implementación administrada proporcionada por Mono. La implementación nativa de Apple admite TLS 1.2.

Advertencia

La próxima versión de Xamarin.Mac 4.8 solo será compatible con macOS 10.9 o versiones posteriores. Las versiones anteriores de Xamarin.Mac son compatibles con macOS 10.7 o versiones posteriores, pero estas versiones anteriores de macOS carecen de infraestructura TLS suficiente para admitir TLS 1.2. Para macOS 10.7 o Mac OS 10.8 de destino, use Xamarin.Mac 4.6 o una versión anterior.

Seguridad de transporte de aplicación

La App Transport Security (ATS) de Apple aplica conexiones seguras entre los recursos de Internet (como el servidor back-end de la aplicación) y su aplicación. ATS garantiza que todas las comunicaciones de Internet 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.

Dado que ATS está activado de forma predeterminada en las aplicaciones creadas para iOS 9, tvOS 9 y OS X 10.11 (El Capitan) y posteriores, 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, producirán un error con una excepción.

En función de las selecciones de implementación de HTTPClient y SSL/TLS, es posible que tenga que realizar modificaciones en la aplicación para que funcione correctamente con ATS.

Para más información sobre ATS, vea nuestra guía Seguridad de transporte de aplicaciones.

Problemas conocidos

En esta sección se tratarán los problemas conocidos con la compatibilidad con TLS en Xamarin.iOS.

Project no se pudo cargar con el error "No se encontró el valor solicitado AppleTLS"

Xamarin.iOS 9.8 introdujo algunas configuraciones nuevas que contenían el archivo .csproj para una aplicación de Xamarin.iOS. Estos cambios pueden causar problemas cuando el proyecto se abre con versiones anteriores de Xamarin.iOS. La captura de pantalla siguiente es un ejemplo del mensaje de error que se puede mostrar en este escenario:

Screenshot of error while trying to load project, requested value legacy not found

Este error se debe a la introducción de la configuración MtouchTlsProvider al archivo de proyecto en Xamarin.iOS 9.8. Si no es posible actualizar a Xamarin.iOS 9.8 (o superior), la solución alternativa consiste en editar manualmente la aplicación de archivo .csproj, quitar el elemento MtouchTlsprovider y, a continuación, guardar el archivo de proyecto cambiado.

El fragmento de código siguiente es un ejemplo del aspecto que puede tener la configuración MtouchTlsProvider dentro de un archivo .csproj:

<MtouchTlsProvider>Default</MtouchTlsProvider>