Pila HttpClient y selector de implementación de SSL/TLS para Android

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

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

Advertencia

Abril de 2018: debido al aumento de los requisitos de seguridad, incluido el cumplimiento de PCI, se espera que los principales proveedores de nube y servidores web dejen de admitir versiones de TLS anteriores a la 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 sigan funcionando con estos servidores y servicios, debe actualizar los proyectos de Xamarin con la configuración y que se muestra a continuación Native TLS 1.2 y, a continuación, volver a compilar y volver a implementar las aplicaciones para los usuarios.

La configuración de HttpClient de Xamarin.Android se encuentra en Project Opciones de Android y,a continuación, haga clic en el botón Opciones avanzadas.

Estas son las opciones recomendadas para la compatibilidad con TLS 1.2:

Visual Studio opciones de Android

Opciones de configuración alternativas

AndroidClientHandler

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

Ventajas

  • Use la API nativa para mejorar el rendimiento y un tamaño ejecutable más pequeño.
  • Compatibilidad con los estándares más recientes, por ejemplo, TLS 1.2.

Desventajas

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

Administrado (HttpClientHandler)

El controlador administrado es el controlador HttpClient totalmente administrado que se ha incluido con versiones anteriores de Xamarin.Android.

Ventajas

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

Desventajas

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

Elegir un controlador

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

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

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

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

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

La desventaja de usar SSL desconcertante como proveedor TLS de subling 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 TLS predeterminado es Ssl desconsonoso btls (). Si no desea usar SSL desaprobado, puede revertir a la implementación de SSL administrada histórica estableciendo la propiedad en (para obtener más información sobre cómo establecer las propiedades de compilación, vea Proceso $(AndroidTlsProvider)legacy de $(AndroidTlsProvider)).

Usar mediante programación AndroidClientHandler

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

Este fragmento de código es un ejemplo de cómo usar explícitamente una única instancia de la HttpClient clase :

// 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+.

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

Esta opción de proyecto controla qué biblioteca TLS subyacente usará toda la solicitud web, HttpClient tanto como WebRequest . De forma predeterminada, tls 1.2 está seleccionado:

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 nativo 1.2+, el objeto usaría automáticamente el administrado y TLS 1.2 (proporcionado por la biblioteca Desl inicialmente) para sus solicitudes HTTP.

Sin embargo, si la implementación de HttpClient se establece en , todos los objetos usarán la clase Java subyacente y no se verán afectados por el valor de implementación de HttpClientjava.net.URLConnectionHttpClient WebRequest Los objetos usarían la biblioteca Desl Desarroba.

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. Seleccione la implementación de HttpClient y la biblioteca TLS predeterminada en Project opciones.
  2. Mediante programación con Xamarin.Android.Net.AndroidClientHandler .
  3. Declare variables de entorno (opcional).

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

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

Declaración de 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 HttpMessageHandler predeterminado 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 , o (que es lo mismo btlslegacy que omitir esta default variable):

    XA_TLS_PROVIDER=btls
    

Esta variable de entorno se establece agregando 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 de entorno de Xamarin.Android para obtener más detalles sobre las variables de entorno y Xamarin.Android.