Seletor de implementação do HttpClient Stack e do SSL/TLS para Android

Os seletores de Implementação httpClient Stack e SSL/TLS determinam a implementação httpClient e SSL/TLS que será usada por seus aplicativos Xamarin.Android.

Os projetos devem fazer referência ao assembly System.Net.Http .

Aviso

Abril de 2018 – Devido ao aumento dos requisitos de segurança, incluindo a conformidade de PCI, espera-se que os principais provedores de nuvem e servidores Web parem de dar suporte a versões TLS anteriores à 1.2. Projetos Xamarin criados em versões anteriores do Visual Studio padrão para usar versões mais antigas do TLS.

Para garantir que seus aplicativos continuem a trabalhar com esses servidores e serviços, você deve atualizar seus projetos Xamarin com as Android HttpClient configurações mostradas abaixo e Native TLS 1.2 , em seguida, compilar novamente e implantar novamente seus aplicativos para seus usuários.

A configuração httpClient do Xamarin.Android está no Project Opções > do Android Options e, em seguida, clique no botão Opções Avançadas.

Estas são as configurações recomendadas para suporte ao TLS 1.2:

Visual Studio Android Options

Opções de configuração alternativas

AndroidClientHandler

AndroidClientHandler é o novo manipulador que delega ao código java/sistema operacional nativo em vez de implementar tudo no código gerenciado. Essa é a opção indicada.

Vantagens

  • Use a API nativa para melhor desempenho e menor tamanho executável.
  • Suporte para os padrões mais recentes, por exemplo. TLS 1.2.

Desvantagens

  • Requer o Android 4.1 ou posterior.
  • Alguns recursos/opções do HttpClient não estão disponíveis.

Gerenciado (HttpClientHandler)

O manipulador gerenciado é o manipulador HttpClient totalmente gerenciado que foi enviado com versões anteriores do Xamarin.Android.

Vantagens

  • É o mais compatível (recursos) com o MS .NET e versões mais antigas do Xamarin.

Desvantagens

  • Ele não está totalmente integrado ao sistema operacional (por exemplo, limitado ao TLS 1.0).
  • Geralmente, ele é muito mais lento (por exemplo, criptografia) do que a API nativa.
  • Ele requer um código mais gerenciado, criando aplicativos maiores.

Escolhendo um manipulador

A escolha entre AndroidClientHandler e HttpClientHandler depende das necessidades do seu aplicativo. AndroidClientHandler é recomendado para o suporte de segurança mais atualizado, por exemplo.

  • Você precisa de suporte do TLS 1.2+.
  • Seu aplicativo tem como alvo o Android 4.1 (API 16) ou posterior.
  • Você precisa de suporte do TLS 1.2+ para HttpClient.
  • Você não precisa de suporte do TLS 1.2+ para WebClient.

HttpClientHandler é uma boa opção se você precisar de suporte do TLS 1.2+, mas deve dar suporte a versões do Android anteriores ao Android 4.1. Também é uma boa opção se você precisar de suporte do TLS 1.2+ para WebClient.

A partir do Xamarin.Android 8.3, HttpClientHandler o padrão é o SSL chato (btls) como o provedor TLS subjacente. O provedor TLS de SSL Chato oferece as seguintes vantagens:

  • Ele dá suporte ao TLS 1.2+.
  • Ele dá suporte a todas as versões do Android.
  • Ele fornece suporte ao TLS 1.2+ para ambos HttpClient e WebClient.

A desvantagem de usar o Boring SSL como o provedor TLS subjacente é que ele pode aumentar o tamanho do APK resultante (ele adiciona cerca de 1 MB de tamanho de APK adicional por ABI com suporte).

A partir do Xamarin.Android 8.3, o provedor TLS padrão é o Boring SSL (btls). Se você não quiser usar o SSL Chato, poderá reverter para a implementação de SSL gerenciada de histórico definindo a $(AndroidTlsProvider) propriedade como (para obter mais informações sobre como legacy definir propriedades de build, consulte o Processo de Build).

Programaticamente usando AndroidClientHandler

A Xamarin.Android.Net.AndroidClientHandler implementação HttpMessageHandler é especificamente para Xamarin.Android. As instâncias dessa classe usarão a implementação nativa java.net.URLConnection para todas as conexões HTTP. Isso teoricamente fornecerá um aumento no desempenho HTTP e tamanhos de APK menores.

Este snippet de código é um exemplo de como explicitamente para uma única instância da HttpClient classe:

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

Observação

O dispositivo Android subjacente deve dar suporte ao TLS 1.2 (ou seja. Android 4.1 e posterior). Observe que o suporte oficial para o TLS 1.2 está no Android 5.0+. No entanto, alguns dispositivos dão suporte ao TLS 1.2 no Android 4.1+.

Opção de build de implementação SSL/TLS

Essa opção de projeto controla qual biblioteca TLS subjacente será usada por todas as solicitações da Web e HttpClientWebRequest. Por padrão, o TLS 1.2 está selecionado:

Por exemplo:

var client = new HttpClient();

Se a implementação do HttpClient foi definida como Gerenciada e a implementação do TLS foi definida como Native TLS 1.2+, o client objeto usaria automaticamente o gerenciado HttpClientHandler e o TLS 1.2 (fornecido pela biblioteca BoringSSL) para suas solicitações HTTP.

No entanto, se a implementação httpClient estiver definida como AndroidHttpClient, todos os HttpClient objetos usarão a classe java.net.URLConnection Java subjacente e não serão afetados pelo valor da implementação TLS/SSL . WebRequest os objetos usariam a biblioteca BoringSSL.

Outras maneiras de controlar a configuração do SSL/TLS

Há três maneiras de um aplicativo Xamarin.Android controlar as configurações do TLS:

  1. Selecione a implementação do HttpClient e a biblioteca TLS padrão nas Opções de Project.
  2. Programaticamente usando Xamarin.Android.Net.AndroidClientHandler.
  3. Declarar variáveis de ambiente (opcional).

Das três opções, a abordagem recomendada é usar as opções de projeto do Xamarin.Android para declarar o padrão HttpMessageHandler e o TLS para todo o aplicativo. Em seguida, se necessário, crie uma instância programática de Xamarin.Android.Net.AndroidClientHandler objetos. Essas opções são descritas acima.

A terceira opção – usando variáveis de ambiente – é explicada abaixo.

Declarar variáveis de ambiente

Há duas variáveis de ambiente relacionadas ao uso do TLS no Xamarin.Android:

  • XA_HTTP_CLIENT_HANDLER_TYPE – Essa variável de ambiente declara o padrão HttpMessageHandler que o aplicativo usará. Por exemplo:

    XA_HTTP_CLIENT_HANDLER_TYPE=Xamarin.Android.Net.AndroidClientHandler
    
  • XA_TLS_PROVIDER – Essa variável de ambiente declarará qual biblioteca TLS será usada, seja btls, legacyou default (que é a mesma que omitir essa variável):

    XA_TLS_PROVIDER=btls
    

Essa variável de ambiente é definida adicionando um arquivo de ambiente ao projeto. Um arquivo de ambiente é um arquivo de texto sem formatação formatado pelo Unix com uma ação de build do AndroidEnvironment:

Consulte o guia de Ambiente do Xamarin.Android para obter mais detalhes sobre variáveis de ambiente e Xamarin.Android.