Pilha HttpClient e Seletor de Implementação de SSL/TLS para Android

Os seletores de Implementação de HttpClient Stack e SSL/TLS determinam a implementação de 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 conformidade com PCI, os principais provedores de nuvem e servidores Web devem parar de dar suporte a versões TLS anteriores à 1.2. Os projetos do Xamarin criados em versões anteriores do Visual Studio usam versões mais antigas do TLS.

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

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

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

Opções do Visual Studio para Android

Opções de configuração alternativas

AndroidClientHandler

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

Vantagens

  • Use a API nativa para obter 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, é 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 para TLS 1.2+.
  • Seu aplicativo tem como destino 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 para 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 de TLS subjacente. O provedor TLS do Boring SSL oferece as seguintes vantagens:

  • Ele dá suporte ao TLS 1.2+.
  • Ele dá suporte a todas as versões do Android.
  • Ele fornece suporte a TLS 1.2+ para 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 SSL Chato (btls). Se você não quiser usar o SSL Chato, poderá reverter para a implementação de SSL gerenciada histórica definindo a $(AndroidTlsProvider) propriedade legacy como (para obter mais informações sobre como definir propriedades de build, consulte Processo de build).

Programaticamente usando AndroidClientHandler

O Xamarin.Android.Net.AndroidClientHandler é uma 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 em 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 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 do 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 de HttpClient foi definida como Gerenciada e a implementação do TLS foi definida como TLS nativo 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 de HttpClient estiver definida AndroidHttpClientcomo , todos os HttpClient objetos usarão a classe java.net.URLConnection Java subjacente e não serão afetados pelo valor de implementação de TLS/SSL . WebRequest os objetos usariam a biblioteca BoringSSL.

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

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

  1. Selecione a implementação de HttpClient e a biblioteca TLS padrão nas Opções do Projeto.
  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, instancie Xamarin.Android.Net.AndroidClientHandler objetos programaticamente. 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, btls, legacyou default (que é o mesmo 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 no 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.