Selector de implementación de HTTPClient y SSL/TLS para Android

Los selectores de implementación de HTTPClient y SSL/TLS determinan la implementación 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 a un aumento de los requisitos de seguridad, incluido el cumplimiento de PCI, se espera que los principales proveedores de nube y servidores web detengan la compatibilidad con las versiones de TLS anteriores a la 1.2. Los proyectos de Xamarin creados en versiones anteriores de Visual Studio usan 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 Android HttpClient configuración y Native TLS 1.2 que se muestran a continuación, volver a compilar e implementar las aplicaciones en los usuarios.

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

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

Opciones de Android de Visual Studio

Opciones de configuración alternativas

AndroidClientHandler

AndroidClientHandler es el nuevo controlador que delega en código Java/OS nativo 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 el 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 httpClient no están disponibles.

Administrado (HttpClientHandler)

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

Ventajas

  • Es la versión 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, cifrado) que la API nativa.
  • Requiere más código administrado, creando aplicaciones más grandes.

Elección de un controlador

La elección entre AndroidClientHandler y HttpClientHandler depende de las necesidades de la aplicación. AndroidClientHandler se recomienda 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 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, HttpClientHandler el valor predeterminado es Boring SSL (btls) como proveedor TLS subyacente. El proveedor DE TLS SSL de boring ofrece las siguientes ventajas:

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

La desventaja de usar BORING SSL como proveedor 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 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 $(AndroidTlsProvider) propiedad legacy en (para obtener más información sobre cómo establecer propiedades de compilación, consulte Proceso de compilación).

Uso mediante programación AndroidClientHandler

Xamarin.Android.Net.AndroidClientHandler es una HttpMessageHandler implementación específica de Xamarin.Android. Las instancias de esta clase usarán la implementación nativa java.net.URLConnection para 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 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 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á toda solicitud web, tanto como HttpClientWebRequest. 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 nativo 1.2 y versiones posteriores, el client objeto usaría automáticamente las instancias administradas HttpClientHandler y TLS 1.2 (proporcionadas por la biblioteca BoringSSL) para sus solicitudes HTTP.

Sin embargo, si la implementación de HttpClient está establecida AndroidHttpClienten , todos los HttpClient objetos usarán la clase java.net.URLConnection Java subyacente y no se verán afectados por el valor de implementación de TLS/SSL . WebRequest Los objetos usarían 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. Seleccione la implementación httpClient y la biblioteca TLS predeterminada en opciones de proyecto.
  2. Mediante programación mediante Xamarin.Android.Net.AndroidClientHandler.
  3. Declare 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 Xamarin.Android.Net.AndroidClientHandler una instancia de objetos mediante programación. Estas opciones se describen anteriormente.

La tercera opción, mediante variables de entorno, se explica a continuación.

Declarar 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, legacyo default (que es la misma que omitir esta 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 del entorno de Xamarin.Android para obtener más detalles sobre las variables de entorno y Xamarin.Android.