Selector de implementación de pila HttpClient y SSL/TLS para Android

Los selectores de implementación de pila HttpClient y SSL/TLS determinan la implementación que usarán las aplicaciones de Xamarin.Android.

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 Android HttpClient y Native TLS 1.2 que se muestra a continuación y, finalmente, volver a compilar y a implementar las aplicaciones para los usuarios.

La configuración de HttpClient para Xamarin.Android se encuentra en Opciones del proyecto > Opciones de Android y, después, debe hacer clic en el botón Opciones avanzadas.

Estos son los valores recomendados para la compatibilidad con TLS 1.2:

Visual Studio Android Options

Opciones de configuración alternativas

AndroidClientHandler

AndroidClientHandler es el nuevo controlador que se delega en código Java/OS nativo en lugar de implementar todo en código administrado. Ésta es la opción recomendada.

Ventajas

  • Usa API nativas para mejorar el rendimiento y conseguir un tamaño más pequeño del archivo ejecutable.
  • Compatibilidad con los estándares más recientes, por ejemplo, TLS 1.2.

Desventajas

  • Requiere Android 4.1 o una versión posterior.
  • Algunas características u opciones de HttpClient no están disponibles.

Administrado (HttpClientHandler)

El controlador administrado es el controlador HttpClient totalmente administrado que se incluía con las versiones anteriores de Xamarin.

Ventajas

  • Es el más compatible (características) con Microsoft .NET y versiones anteriores de Xamarin.

Desventajas

  • No está totalmente integrado con el sistema operativo (por ejemplo, se limita a TLS 1.0).
  • Normalmente es mucho más lento (por ejemplo, en el cifrado) que la API nativa.
  • Requiere más código administrado, lo cual crea aplicaciones más grandes.

Elección de un controlador

La elección entre AndroidClientHandler y HttpClientHandler depende de las necesidades de la aplicación. Se recomienda AndroidClientHandler para la compatibilidad de seguridad más actualizada, por ejemplo,

  • Necesita compatibilidad con TLS 1.2 y versiones posteriores.
  • La aplicación tiene como destino Android 4.1 (API 16) o posterior.
  • Necesita compatibilidad de TLS 1.2 y versiones posteriores con HttpClient.
  • No necesita compatibilidad de TLS 1.2 y versiones posteriores con WebClient.

HttpClientHandler es una buena opción si necesita compatibilidad con TLS 1.2 y versiones posteriores, pero debe admitir versiones de Android anteriores a Android 4.1. También es una buena opción si necesita compatibilidad de TLS 1.2 y versiones posteriores con WebClient.

A partir de Xamarin.Android 8.3, el valor predeterminado de HttpClientHandler es Boring SSL (btls) como proveedor de TLS subyacente. El proveedor de TLS de Boring SSL ofrece las siguientes ventajas:

  • Admite TLS 1.2 y versiones posteriores.
  • Admite todas las versiones de Android.
  • Proporciona compatibilidad de TLS 1.2 y versiones posteriores con HttpClient y WebClient.

La desventaja de usar Boring SSL como proveedor de TLS subyacente es que puede aumentar el tamaño del APK resultante (agrega aproximadamente 1 MB de tamaño de APK adicional por ABI compatible).

A partir de Xamarin.Android 8.3, el proveedor de TLS predeterminado es Boring SSL (btls). Si no desea usar Boring SSL, puede revertir a la implementación de SSL administrada histórica estableciendo la propiedad $(AndroidTlsProvider) en legacy (para más información sobre cómo establecer las propiedades de compilación, consulte Proceso de compilación).

Uso de AndroidClientHandler mediante programación

Xamarin.Android.Net.AndroidClientHandler es una implementación de HttpMessageHandler específica para Xamarin.Android. Las instancias de esta clase usarán la implementación nativa de java.net.URLConnection de todas las conexiones HTTP. Esto proporcionará teóricamente un aumento en el rendimiento HTTP y tamaños de APK más pequeños.

Este fragmento de código es un ejemplo de cómo realizar explícitamente una sola instancia de la clase HttpClient:

// Android 4.1 or higher, Xamarin.Android 6.1 or higher
HttpClient client = new HttpClient(new Xamarin.Android.Net.AndroidClientHandler ());

Nota:

El dispositivo Android subyacente debe admitir TLS 1.2 (es decir, Android 4.1 y versiones posteriores). Tenga en cuenta que la compatibilidad oficial con TLS 1.2 está en Android 5.0 y versiones posteriores. Sin embargo, algunos dispositivos admiten TLS 1.2 en Android 4.1 y versiones posteriores.

Opción de compilación de implementación de SSL/TLS

Esta opción de proyecto controla qué biblioteca TLS subyacente usarán todas las solicitudes web, tanto HttpClient como WebRequest. De forma predeterminada, se selecciona TLS 1.2:

Por ejemplo:

var client = new HttpClient();

Si la implementación de HttpClient se estableció en Administrado y la implementación de TLS se estableció en TLS 1.2 nativo y versiones posteriores, el objeto client usará automáticamente el HttpClientHandler administrado y TLS 1.2 (proporcionados por la biblioteca BoringSSL) para sus solicitudes HTTP.

No obstante, si la implementación de HttpClient está establecida en AndroidHttpClient, todos los objetos HttpClient usarán la clase java.net.URLConnection de Java subyacente y no se verán afectados por el valor de la implementación de TLS/SSL. Los objetos WebRequest usarán la biblioteca BoringSSL.

Otras formas de controlar la configuración de SSL/TLS

Hay tres maneras de que una aplicación de Xamarin.Android pueda controlar la configuración de TLS:

  1. Seleccionar la implementación de HttpClient y la biblioteca TLS predeterminada en Opciones del proyecto.
  2. Usar Xamarin.Android.Net.AndroidClientHandler mediante programación.
  3. Declarar variables de entorno (opcional).

De las tres opciones, el enfoque recomendado es usar las opciones del proyecto de Xamarin.Android para declarar el valor predeterminado HttpMessageHandler y TLS para toda la aplicación. A continuación, si es necesario, cree instancias de los objetos Xamarin.Android.Net.AndroidClientHandler mediante programación. Estas opciones se han descrito anteriormente.

A continuación se explica la tercera opción, usar variables de entorno.

Declaración de las variables de entorno

Hay dos variables de entorno relacionadas con el uso de TLS en Xamarin.Android:

  • XA_HTTP_CLIENT_HANDLER_TYPE: esta variable de entorno declara el valor predeterminado HttpMessageHandler que usará la aplicación. Por ejemplo:

    XA_HTTP_CLIENT_HANDLER_TYPE=Xamarin.Android.Net.AndroidClientHandler
    
  • XA_TLS_PROVIDER: esta variable de entorno declarará qué biblioteca TLS se usará, ya sea btls, legacy o default (esta última genera el mismo resultado que omitir esta variable):

    XA_TLS_PROVIDER=btls
    

Para establecer esta variable de entorno, agregue un archivo de entorno al proyecto. Un archivo de entorno es un archivo de texto sin formato Unix con una acción de compilación de AndroidEnvironment:

Consulte la guía del entorno de Xamarin.Android para más información sobre las variables de entorno y Xamarin.Android.