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 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
yWebClient
.
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 HttpClient
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 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 AndroidHttpClient
en , 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:
- Seleccione la implementación httpClient y la biblioteca TLS predeterminada en opciones de proyecto.
- Mediante programación mediante
Xamarin.Android.Net.AndroidClientHandler
. - 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 predeterminadoHttpMessageHandler
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 seabtls
,legacy
odefault
(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.