Partilhar via


Seletor de implementação de HttpClient e SSL/TLS para iOS/macOS

O Seletor de Implementação httpClient para Xamarin.iOS, Xamarin.tvOS e Xamarin.Mac controla qual HttpClient implementação usar. Você pode alternar para uma implementação que usa transportes nativos do iOS, tvOS ou macOS (NSUrlSession ou CFNetwork, dependendo do sistema operacional). O lado positivo é o suporte ao TLS 1.2, binários menores e downloads mais rápidos; a desvantagem é que ele requer que o loop de eventos esteja em execução para que as operações assíncronas sejam executadas.

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 com mais de 1.2. Os 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 funcionando com esses servidores e serviços, você deve atualizar seus projetos do Xamarin com a NSUrlSession configuração mostrada abaixo e, em seguida, recriar e implantar novamente seus aplicativos para seus usuários .

Selecionando uma pilha HttpClient

Para ajustar o HttpClient que está sendo usado pelo seu aplicativo:

  1. Clique duas vezes no Nome do Projeto no Gerenciador de Soluções para abrir as Opções do Projeto.
  2. Alterne para as configurações de build do projeto (por exemplo, Build do iOS para um aplicativo Xamarin.iOS).
  3. Na lista suspensa Implementação de HttpClient , selecione o HttpClient tipo como um dos seguintes: NSUrlSession (recomendado), CFNetwork ou Gerenciado.

Escolha Implementação de HttpClient de Managed, CFNetwork ou NSUrlSession

Dica

Para o TLS 1.2, é recomendável dar suporte à opção NSUrlSession .

NSUrlSession

O NSURLSessionmanipulador baseado em é baseado na estrutura nativa NSURLSession disponível no iOS 7 e mais recente. Esta é a configuração recomendável.

Vantagens

  • Ele usa APIs nativas para melhor desempenho e menor tamanho executável.
  • Suporte para os padrões mais recentes, como o TLS 1.2.

Desvantagens

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

CFNetwork

O CFNetworkmanipulador baseado em é baseado na estrutura nativa CFNetwork disponível no iOS 6 e mais recente.

Vantagens

  • Ele usa APIs nativas para melhor desempenho e menor tamanho executável.
  • Suporte para padrões mais recentes, como o TLS 1.2.

Desvantagens

  • Requer o iOS 6 ou posterior.
  • Não disponível no watchOS.
  • Alguns recursos/opções do HttpClient não estão disponíveis.

Gerenciado

O manipulador Gerenciado é o manipulador HttpClient totalmente gerenciado que foi enviado com a versão anterior do Xamarin.

Vantagens

  • Ele tem o conjunto de recursos mais compatível com o Microsoft .NET e versões mais antigas do Xamarin.

Desvantagens

  • Ele não é totalmente integrado ao Apple OSes e está limitado ao TLS 1.0. Ele pode não ser capaz de se conectar a servidores Web seguros ou serviços de nuvem no futuro.
  • Normalmente, ele é muito mais lento em coisas como criptografia do que as APIs nativas.
  • Ele requer mais código gerenciado, criando assim um aplicativo maior distribuível.

Definindo programaticamente o HttpMessageHandler

Além da configuração de todo o projeto mostrada acima, você também pode instanciar um HttpClient e injetar o desejado HttpMessageHandler por meio do construtor, conforme demonstrado nestes snippets de código:

// This will use the default message handler for the application; as
// set in the Project Options for the project.
HttpClient client = new HttpClient();

// This will create an HttpClient that explicitly uses the CFNetworkHandler
HttpClient client = new HttpClient(new CFNetworkHandler());

// This will create an HttpClient that explicitly uses NSUrlSessionHandler
HttpClient client = new HttpClient(new NSUrlSessionHandler());

Isso possibilita usar um diferente HttpMessageHandler do que é declarado na caixa de diálogo Opções do Projeto .

Implementação de SSL/TLS

O SSL (Secure Socket Layer) e seu sucessor, TLS (Transport Layer Security), fornecem suporte para HTTP e outras conexões de rede por meio de System.Net.Security.SslStream. A implementação de System.Net.Security.SslStream Xamarin.iOS, Xamarin.tvOS ou Xamarin.Mac chamará a implementação nativa de SSL/TLS da Apple em vez de usar a implementação gerenciada fornecida pelo Mono. A implementação nativa da Apple dá suporte ao TLS 1.2.

Aviso

A próxima versão do Xamarin.Mac 4.8 dará suporte somente a macOS 10.9 ou posterior. As versões anteriores do Xamarin.Mac eram compatíveis com macOS 10.7 ou superior, mas essas versões mais antigas do macOS não têm infraestrutura TLS suficiente para dar suporte ao TLS 1.2. Para macOS 10.7 ou macOS 10.8, use o Xamarin.Mac 4.6 ou anterior.

Segurança do transporte de aplicativo

A ATS ( Segurança de Transporte de Aplicativo ) da Apple impõe conexões seguras entre recursos da Internet (como o servidor de back-end do aplicativo) e seu aplicativo. A ATS garante que todas as comunicações da Internet estejam em conformidade com as melhores práticas de conexão seguras, impedindo assim a divulgação acidental de informações confidenciais diretamente por meio do aplicativo ou de uma biblioteca que ela está consumindo.

Como o ATS é habilitado por padrão em aplicativos criados para iOS 9, tvOS 9 e OS X 10.11 (El Capitan) e mais recentes, todas as conexões que usam NSUrlConnectionou CFUrlNSUrlSession estarão sujeitas aos requisitos de segurança do ATS. Se suas conexões não atenderem a esses requisitos, elas falharão com uma exceção.

Com base nas seleções de Implementação do HttpClient Stack e do SSL/TLS, talvez seja necessário fazer modificações em seu aplicativo para funcionar corretamente com o ATS.

Para saber mais sobre a ATS, consulte nosso guia de Segurança de Transporte de Aplicativo.

Problemas conhecidos

Esta seção abordará problemas conhecidos com o suporte a TLS no Xamarin.iOS.

Falha ao carregar o projeto com o erro "O valor solicitado AppleTLS não foi encontrado"

O Xamarin.iOS 9.8 introduziu algumas novas configurações que continham o arquivo .csproj para um aplicativo Xamarin.iOS. Essas alterações podem causar problemas quando o projeto é aberto com versões mais antigas do Xamarin.iOS. A captura de tela a seguir é um exemplo da mensagem de erro que pode ser exibida neste cenário:

Captura de tela do erro ao tentar carregar o projeto, o valor solicitado herdado não encontrado

Esse erro é causado pela introdução da MtouchTlsProvider configuração ao arquivo de projeto no Xamarin.iOS 9.8. Se não for possível atualizar para o Xamarin.iOS 9.8 (ou superior), a solução alternativa será editar manualmente o aplicativo de arquivo .csproj , remover o MtouchTlsprovider elemento e salvar o arquivo de projeto alterado.

O snippet a seguir é um exemplo de como a MtouchTlsProvider configuração pode ser dentro de um arquivo .csproj :

<MtouchTlsProvider>Default</MtouchTlsProvider>