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 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
eWebClient
.
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 HttpClient
WebRequest
. 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 AndroidHttpClient
como , 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:
- Selecione a implementação de HttpClient e a biblioteca TLS padrão nas Opções do Projeto.
- Programaticamente usando
Xamarin.Android.Net.AndroidClientHandler
. - 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ãoHttpMessageHandler
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
,legacy
oudefault
(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.