Segurança de transporte de aplicativos no Xamarin.iOS

O ATS (App Transport Security) impõe conexões seguras entre recursos da Internet (como o servidor back-end do aplicativo) e seu aplicativo.

Este artigo apresentará as alterações de segurança que o App Transport Security impõe em um aplicativo iOS 9 e o que isso significa para seus projetos Xamarin.iOS, abordará as opções de configuração do ATS e abordará como desativar o ATS ATS, se necessário. Como o ATS está habilitado por padrão, qualquer conexão de Internet não segura gerará uma exceção nos aplicativos do iOS 9 (a menos que você tenha permitido explicitamente).

Sobre a segurança de transporte de aplicativos

Como dito acima, o ATS garante que todas as comunicações pela Internet no iOS 9 e no OS X El Capitan estejam em conformidade com as práticas recomendadas de conexão segura, evitando assim a divulgação acidental de informações confidenciais diretamente por meio de seu aplicativo ou de uma biblioteca que ele está consumindo.

Para aplicativos existentes, implemente o HTTPS protocolo sempre que possível. Para novos aplicativos Xamarin.iOS, você deve usar HTTPS exclusivamente ao se comunicar com recursos da Internet. Além disso, a comunicação de API de alto nível deve ser criptografada usando TLS versão 1.2 com sigilo de encaminhamento.

Qualquer conexão feita com NSUrlConnection, CFUrl ou NSUrlSession usará ATS por padrão em aplicativos criados para iOS 9 e OS X 10.11 (El Capitan).

Comportamento padrão do ATS

Como o ATS é habilitado por padrão em aplicativos criados para iOS 9 e OS X 10.11 (El Capitan), todas as conexões usando NSUrlConnection, CFUrl ou NSUrlSession 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.

Requisitos de conexão ATS

O ATS aplicará os seguintes requisitos para todas as conexões com a Internet:

  • Todas as cifras de conexão devem estar usando sigilo de encaminhamento. Veja a lista de cifras aceitas abaixo.
  • O protocolo TLS (Transport Layer Security) deve ser versão 1.2 ou superior.
  • Pelo menos uma impressão digital SHA256 com uma chave RSA de 2048 bits ou superior, ou uma chave ECC (Elliptic-Curve) de 256 bits ou superior deve ser usada para todos os certificados.

Novamente, como o ATS está habilitado por padrão no iOS 9, qualquer tentativa de fazer uma conexão que não atenda a esses requisitos resultará em uma exceção sendo lançada.

Cifras compatíveis com ATS

Os seguintes tipos de cifra de sigilo de encaminhamento são aceitos pelas comunicações de Internet seguras do ATS:

  • TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384
  • TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256
  • TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384
  • TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA
  • TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256
  • TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA
  • TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384
  • TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
  • TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384
  • TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256
  • TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA

Para obter mais informações sobre como trabalhar com classes de comunicação pela Internet do iOS, consulte NSURLConnection Class Reference ou NSURLSession Class Reference da Apple.

Suporte a ATS no Xamarin.iOS

Como o ATS está habilitado por padrão no iOS 9 e no OS X El Capitan, se seu aplicativo Xamarin.iOS ou qualquer biblioteca ou serviço que ele estiver usando fizer conexão com a Internet, você precisará tomar alguma ação ou suas conexões resultarão em uma exceção sendo lançada.

Para um aplicativo existente, a Apple sugere que você suporte o protocolo o HTTPS mais rápido possível. Se você não puder porque está se conectando a um serviço Web de terceiros que não oferece suporte HTTPS ou se o suporte HTTPS for impraticável, você pode desativar o ATS. Consulte a seção Opting-Out do ATS abaixo para obter mais detalhes.

Para um novo aplicativo Xamarin.iOS, você deve usar HTTPS exclusivamente ao se comunicar com recursos da Internet. Novamente, pode haver situações (como usar um serviço Web de terceiros 3) em que isso não é possível e você precisará desativar o ATS.

Além disso, o ATS impõe a comunicação de API de alto nível a ser criptografada usando TLS versão 1.2 com sigilo de encaminhamento. Consulte as seções Requisitos de conexão ATS e Cifras compatíveis com ATS acima para obter mais detalhes.

Embora você possa não estar familiarizado com o TLS (Transport Layer Security), ele é o sucessor do SSL (Secure Socket Layer) e fornece uma coleção de protocolos criptográficos para impor segurança em conexões de rede.

O nível TLS é controlado pelo serviço Web que você está consumindo e, portanto, está fora do controle do aplicativo. Tanto o HttpClient quanto o ModernHttpClient devem usar automaticamente o nível mais alto de criptografia TLS suportado pelo servidor.

Dependendo do servidor com o qual você está falando (especialmente se for um serviço de terceiros 3rd), talvez seja necessário desativar o sigilo de encaminhamento ou selecionar um nível TLS mais baixo. Consulte a seção Configurando opções do ATS abaixo para obter mais detalhes.

Importante

A Segurança de Transporte de Aplicativo não se aplica a aplicativos Xamarin que usam implementações HTTPClient gerenciadas. Ele se aplica apenas a conexões que usam implementações CFNetwork HTTPClient ou implementações NSURLSession HTTPClient.

Configurando a implementação HTTPClient

Para definir a implementação HTTPClient usada por um aplicativo iOS, clique duas vezes no projeto no Gerenciador de soluções para abrir as Opções do projeto. Navegue até iOS Build e selecione o tipo de cliente desejado na lista suspensa Implementação HttpClient:

Definindo as opções de compilação do iOS

Manipulador gerenciado

O manipulador gerenciado é o manipulador HttpClient totalmente gerenciado que foi fornecido com versões anteriores do Xamarin.iOS e é o manipulador padrão.

Prós:

  • É o mais compatível com o Microsoft .NET e versão mais antiga do Xamarin.

Desvantagens:

  • Ele não é totalmente integrado ao iOS (por exemplo, é limitado ao TLS 1.0).
  • Geralmente é muito mais lento do que as APIs nativas.
  • Ele requer mais código gerenciado e cria aplicativos maiores.

Manipulador CFNetwork

O manipulador baseado em CFNetwork é baseado na estrutura nativa CFNetwork .

Prós:

  • Usa API nativa para melhor desempenho e tamanhos de executáveis menores.
  • Adiciona suporte para padrões mais recentes, como TLS 1.2.

Desvantagens:

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

Manipulador NSUrlSession

O manipulador baseado em NSUrlSession é baseado na API nativa NSUrlSession .

Prós:

  • Usa API nativa para melhor desempenho e tamanhos de executáveis menores.
  • Adiciona suporte para padrões mais recentes, como TLS 1.2.

Desvantagens:

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

Diagnosticando problemas de ATS

Ao tentar se conectar à Internet, diretamente ou a partir de uma exibição da Web no iOS 9, você pode receber um erro no formulário:

O App Transport Security bloqueou uma carga de recursos HTTP (http://www.-the-blocked-domain.com) de texto não criptografado, pois ela é insegura. Exceções temporárias podem ser configuradas por meio do arquivo Info.plist do seu aplicativo.

No iOS9, o ATS (App Transport Security) impõe conexões seguras entre recursos da Internet (como o servidor back-end do aplicativo) e seu aplicativo. Além disso, o ATS requer que a comunicação usando o protocolo e a HTTPS comunicação de API de alto nível seja criptografada usando TLS versão 1.2 com sigilo de encaminhamento.

Como o ATS está habilitado por padrão em aplicativos criados para iOS 9 e OS X 10.11 (El Capitan), todas as conexões que usam NSURLConnectiono , CFURL ou NSURLSession 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.

A Apple também fornece o aplicativo de exemplo TLSTool que pode ser compilado (ou opcionalmente transcodificado para Xamarin e C#) e usado para diagnosticar problemas de ATS/TLS. Consulte a seção Opting-Out do ATS abaixo para obter informações sobre como resolver esse problema.

Configurando opções do ATS

Você pode configurar vários dos recursos do ATS definindo valores para chaves específicas no arquivo Info.plist do seu aplicativo. As seguintes chaves estão disponíveis para controlar o ATS (recuadas para mostrar como estão aninhadas):

NSAppTransportSecurity
    NSAllowsArbitraryLoads
    NSAllowsArbitraryLoadsInWebContent
    NSExceptionDomains
    <domain-name-for-exception-as-string>
        NSExceptionMinimumTLSVersion
        NSExceptionRequiresForwardSecrecy
        NSExceptionAllowsInsecureHTTPLoads
        NSRequiresCertificateTransparency
        NSIncludesSubdomains
        NSThirdPartyExceptionMinimumTLSVersion
        NSThirdPartyExceptionRequiresForwardSecrecy
        NSThirdPartyExceptionAllowsInsecureHTTPLoads

Cada chave tem o seguinte tipo e significado:

  • NSAppTransportSecurity (Dictionary) - Contém todas as chaves de configuração e valores para o ATS.
  • NSAllowsArbitraryLoads (Boolean) - Se YES o ATS for desabilitado para qualquer domínio não listado no NSExceptionDomains. Para domínios listados, as configurações de segurança especificadas serão usadas.
  • NSAllowsArbitraryLoadsInWebContent (Boolean) - Se YES permitirá que as páginas da Web sejam carregadas corretamente enquanto a proteção do Apple Transport Security (ATS) ainda estiver ativada para o restante do aplicativo.
  • NSExceptionDomains (Dictionary) - Uma coleção de domínios que e as configurações de segurança que o ATS deve usar para um determinado domínio.
  • <domain-name-for-exception-as-string> (Dictionary) - Uma coleção de exceções para um determinado domínio (por exemplo. www.xamarin.com).
  • NSExceptionMinimumTLSVersion (String) - A versão mínima do TLS como TLSv1.0, TLSv1.1 ou TLSv1.2 (que é o padrão).
  • NSExceptionRequiresForwardSecrecy (Boolean) - Se NO o domínio não precisar usar uma cifra com segurança de encaminhamento. O valor padrão é YES.
  • NSExceptionAllowsInsecureHTTPLoads (Boolean) - Se NO (o padrão) todas as comunicações com este domínio devem estar no HTTPS protocolo.
  • NSRequiresCertificateTransparency (Boolean) - Se YES o SSL (Secure Sockets Layer) do domínio deve incluir dados de transparência válidos. O valor padrão é NO.
  • NSIncludesSubdomains (Boolean) - Se YES essas configurações substituírem todos os subdomínios deste domínio. O valor padrão é NO.
  • NSThirdPartyExceptionMinimumTLSVersion (String) - A versão TLS usada quando o domínio é um serviço de terceiros 3rd fora do controle do desenvolvedor.
  • NSThirdPartyExceptionRequiresForwardSecrecy (Boolean) - Se YES um domínio de 3ª parte exigir sigilo de encaminhamento.
  • NSThirdPartyExceptionAllowsInsecureHTTPLoads (Boolean) - Se YES o ATS permitir comunicação não segura com domínios de terceiros.

Exclusão do ATS

Embora a Apple sugira o uso do protocolo e a HTTPS comunicação segura com informações baseadas na internet, pode haver momentos em que isso nem sempre seja possível. Por exemplo, se você estiver se comunicando com um serviço Web de terceiros ou usando anúncios veiculados pela Internet em seu aplicativo.

Se o aplicativo Xamarin.iOS precisar fazer uma solicitação para um domínio inseguro, as seguintes alterações no arquivo Info.plist do aplicativo desabilitarão os padrões de segurança que o ATS impõe para um determinado domínio:

<key>NSAppTransportSecurity</key>
<dict>
    <key>NSExceptionDomains</key>
    <dict>
        <key>www.the-domain-name.com</key>
        <dict>
            <key>NSExceptionMinimumTLSVersion</key>
            <string>TLSv1.0</string>
            <key>NSExceptionRequiresForwardSecrecy</key>
            <false/>
            <key>NSExceptionAllowsInsecureHTTPLoads</key>
            <true/>
            <key>NSIncludesSubdomains</key>
            <true/>
        </dict>
    </dict>
</dict>

Dentro do Visual Studio para Mac, clique duas vezes no Info.plist arquivo no Gerenciador de Soluções, alterne para o modo de exibição Código-fonte e adicione as chaves acima:

A exibição Origem do arquivo Info.plist depois de adicionar chaves especificadas.

Se o aplicativo precisar carregar e exibir conteúdo da Web de sites não seguros, adicione o seguinte ao arquivo Info.plist do aplicativo para permitir que as páginas da Web sejam carregadas corretamente enquanto a proteção do Apple Transport Security (ATS) ainda estiver ativada para o restante do aplicativo:

<key>NSAppTransportSecurity</key>
<dict>
    <key> NSAllowsArbitraryLoadsInWebContent</key>
    <true/>
</dict>

Opcionalmente, você pode fazer as seguintes alterações no arquivo Info.plist do seu aplicativo para desabilitar completamente o ATS para todos os domínios e comunicação com a Internet:

<key>NSAppTransportSecurity</key>
<dict>
    <key>NSAllowsArbitraryLoads</key>
    <true/>
</dict>

Dentro do Visual Studio para Mac, clique duas vezes no Info.plist arquivo no Gerenciador de Soluções, alterne para o modo de exibição Código-fonte e adicione as chaves acima:

A exibição Source do arquivo Info.plist depois de especificar NSAllowsArbitraryLoadsInWebContent e NSAllowsArbitraryLoads.

Importante

Se seu aplicativo exigir uma conexão com um site inseguro, você sempre deverá inserir o domínio como uma exceção usando NSExceptionDomains em vez de desativar completamente o ATS usando NSAllowsArbitraryLoadso . NSAllowsArbitraryLoads só deve ser usado em situações extremas de emergência.

Novamente, desabilitar o ATS só deve ser usado como último recurso, se a mudança para conexões seguras não estiver disponível ou for impraticável.

Resumo

Este artigo introduziu o ATS (App Transport Security) e descreveu a maneira como ele impõe comunicações seguras com a Internet. Primeiro, abordamos as mudanças que o ATS exige para um aplicativo Xamarin.iOS em execução no iOS 9. Em seguida, abordamos o controle de recursos e opções do ATS. Finalmente, cobrimos a exclusão do ATS em seu aplicativo Xamarin.iOS.