Como é que carrego um URL de HTTP com a segurança do transporte da aplicação activada no iOS 9? [duplicado]

[[2] esta pergunta já tem uma resposta aqui:

então, o novo beta SDK do iOS lançado ontem à noite tem "App Transport Security" que incentiva os desenvolvedores a usar https em vez de http. Em princípio, esta é uma grande ideia, e eu já uso https em nosso ambientes de encenação / produção. No entanto, eu não tenho https configurados em meu ambiente de desenvolvimento local, quando o aplicativo iOS está conectando a um serviço web que estou executando no meu laptop.

a partir de um pouco de reprodução em torno desta manhã, parece que o sistema de carregamento de URL irá, mesmo que você lhe dê um URL http, decidir usar https em vez disso. Alguém sabe como desactivar este comportamento, mesmo só por URLs em particular?

Author: soulshined, 2015-06-09

8 answers

Ver a informação da Apple .referência do plist para mais detalhes (obrigado @gnasher729).

Pode adicionar excepções para domínios específicos na sua informação.plist:

<key>NSAppTransportSecurity</key>
<dict>
    <key>NSExceptionDomains</key>
    <dict>
        <key>testdomain.com</key>
        <dict>
            <key>NSIncludesSubdomains</key>
            <true/>
            <key>NSExceptionAllowsInsecureHTTPLoads</key>
            <true/>
            <key>NSExceptionRequiresForwardSecrecy</key>
            <true/>
            <key>NSExceptionMinimumTLSVersion</key>
            <string>TLSv1.2</string>
            <key>NSThirdPartyExceptionAllowsInsecureHTTPLoads</key>
            <false/>
            <key>NSThirdPartyExceptionRequiresForwardSecrecy</key>
            <true/>
            <key>NSThirdPartyExceptionMinimumTLSVersion</key>
            <string>TLSv1.2</string>
            <key>NSRequiresCertificateTransparency</key>
            <false/>
        </dict>
    </dict>
</dict>

Todas as chaves para cada domínio excluído são opcionais. O orador não explicou nenhuma das chaves, mas acho que são todas razoavelmente óbvias.

(Fonte: WWDC 2015 sessão 703, "Privacy and Your App", 30:18)

Também pode ignorar todas as restrições de segurança da aplicação com um uma única chave, se a sua aplicação tiver uma boa razão para o fazer:

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

Se a sua aplicação não tiver uma boa razão, pode correr o risco de rejeição:

Configurar os NSAllowsArbitraryLoads como verdadeiros irá permitir que funcione, mas a Apple foi muito clara na sua intenção de rejeitar os aplicativos que usam esta bandeira sem uma razão específica. A principal razão para usar Nsallowsarbitaryloads que eu posso pensar seria o Conteúdo criado pelo usuário (Compartilhamento de links, navegador Web personalizado, etc). E neste caso, a Apple ainda espera que o faças. inclua exceções que imponham o ATS para os URLs que você está no controle.

Se você precisar de acesso a URLs específicos que não são servidos sobre TLS 1.2, você precisa escrever exceções específicas para esses domínios, não usar Nsallowsarbitaryloads configurados para Sim. Você pode encontrar mais informações na sessão da WWDC NSURLSession.

Por favor, tenha cuidado em partilhar a solução NSAllowsArbitraryLoads. Não é a dose recomendada da Apple.

- kcharwood @marco-tolman)

 636
Author: adurdin, 2015-12-16 13:20:32

Como a resposta aceite forneceu as informações necessárias, e para mais informações sobre a utilização e desactivação da segurança de transporte da aplicação, pode-se encontrar mais informações sobre este.

Para excepções por domínio, adicione estas à informação .plist:

<key>NSAppTransportSecurity</key>
<dict>
  <key>NSExceptionDomains</key>
  <dict>
    <key>yourserver.com</key>
    <dict>
      <!--Include to allow subdomains-->
      <key>NSIncludesSubdomains</key>
      <true/>
      <!--Include to allow HTTP requests-->
      <key>NSTemporaryExceptionAllowsInsecureHTTPLoads</key>
      <true/>
      <!--Include to specify minimum TLS version-->
      <key>NSTemporaryExceptionMinimumTLSVersion</key>
      <string>TLSv1.1</string>
    </dict>
  </dict>
</dict>

Mas e se eu não souber todos os domínios inseguros que preciso de usar? Use a seguinte chave na Sua Informação .plist

<key>NSAppTransportSecurity</key>
<dict>
  <!--Include to allow all connections (DANGER)-->
  <key>NSAllowsArbitraryLoads</key>
      <true/>
</dict>

Para mais detalhes você pode obter a partir deste link.

 94
Author: Akshay Sunderwani, 2015-08-03 07:04:15

Depois disto.

Resolvi-o adicionando uma chave na informação.plist. Os passos que segui são:
  1. Abriu o meu ficheiro de projectos info.plist

  2. Adicionou uma chave chamada NSAppTransportSecurity como Dictionary.

  3. adicionou uma sub-chave chamada NSAllowsArbitraryLoads como Boolean e fixou o seu valor em YES como se fosse a seguinte imagem. enter image description here
Limpa o projecto e agora está tudo a correr como antes.

Ref Link .

 49
Author: Manab Kumar Mal, 2017-05-23 12:10:26

Se você só quer desativar a Política de transporte de aplicativos para servidores dev locais, então as seguintes soluções funcionam bem. É útil quando você é incapaz, ou é impraticável, de configurar HTTPS (por exemplo, ao usar o Google App Engine dev server).

Como outros já disseram, a ATP não deve ser desligada para aplicações de produção.

1) Utilize um plano diferente para depurar

Copie o seu ficheiro Plist e Nsallowsarbitaryloads. Use esta barra para depuracao.

XCode Debug

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

2) excluir os servidores locais

Em alternativa, pode usar um único ficheiro plist e excluir servidores específicos. No entanto, não parece que possa excluir os endereços IP 4 , pelo que poderá ter de usar o nome do servidor em alternativa (encontrado nas preferências do sistema -> partilha ou configurado no seu DNS local).

<key>NSAppTransportSecurity</key>
<dict>
    <key>NSExceptionDomains</key>
    <dict>
        <key>server.local</key>
        <dict/>
        <key>NSExceptionAllowsInsecureHTTPLoads</key>
        <true/>
    </dict>
</dict>
 29
Author: Ian, 2017-05-23 12:10:26
Resolvi como ficheiro plist.
  1. Adicione um Nsapptransportsegurança: dicionário.
  2. Adicionar uma sub-chave chamada "Nsallowsarbitaryloads" como booleana: Sim

enter image description here

 26
Author: Avinash651, 2015-10-08 05:54:33
As configurações acima não funcionaram para mim. Tentei muitas combinações de chaves, esta funciona bem.

enter image description here

<key>NSAppTransportSecurity</key>
<dict>
    <key>NSExceptionDomains</key>
    <dict>
        <key>mydomain.com</key>
        <dict>
            <key>NSIncludesSubdomains</key>
            <true/>
            <key>NSExceptionAllowsInsecureHTTPLoads</key>
            <true/>
            <key>NSExceptionRequiresForwardSecrecy</key>
            <false/>
        </dict>
    </dict>
</dict>
 19
Author: Damien Romito, 2015-09-25 10:02:03

A compilar as respostas dadas por @adurdin e @User

Adicione seguimentos à sua informação.plist & change localhost.com com o seu nome de domínio correspondente, poderá adicionar vários domínios também:

<key>NSAppTransportSecurity</key>
<dict>
    <key>NSAllowsArbitraryLoads</key>
    <true/>
    <key>NSExceptionDomains</key>
    <dict>
        <key>localhost.com</key>
        <dict>
            <key>NSIncludesSubdomains</key>
            <false/>
            <key>NSExceptionAllowsInsecureHTTPLoads</key>
            <false/>
            <key>NSExceptionRequiresForwardSecrecy</key>
            <true/>
            <key>NSExceptionMinimumTLSVersion</key>
            <string>TLSv1.2</string>
            <key>NSThirdPartyExceptionAllowsInsecureHTTPLoads</key>
            <false/>
            <key>NSThirdPartyExceptionRequiresForwardSecrecy</key>
            <true/>
            <key>NSThirdPartyExceptionMinimumTLSVersion</key>
            <string>TLSv1.2</string>
            <key>NSRequiresCertificateTransparency</key>
            <false/>
        </dict>
    </dict>
</dict>
</plist>

Informação.o plist deve ser assim:

enter image description here

 15
Author: Aqib Mumtaz, 2015-08-11 13:26:12
Eis o que funcionou para mim:
<key>NSAppTransportSecurity</key>
<dict>
    <key>NSAllowsArbitraryLoads</key>
    <false/>
    <key>NSExceptionDomains</key>
    <dict>
        <key><!-- your_remote_server.com / localhost --></key>
        <dict>
            <key>NSIncludesSubdomains</key>
            <true/>
            <key>NSExceptionAllowsInsecureHTTPLoads</key>
            <true/>
            <key>NSExceptionRequiresForwardSecrecy</key>
            <true/>
        </dict>
    <!-- add more domain here -->
    </dict>
</dict>
Só quero acrescentar isto para ajudar os outros e poupar tempo.

Se estiver a utilizar: CFStreamCreatePairWithSocketToHost. certifique-se de que o seu host é o mesmo com o que tem no seu .plist ou se tiver um domínio separado para o 'socket' basta adicioná-lo lá.

CFStreamCreatePairWithSocketToHost(NULL, (__bridge CFStringRef)/*from .plist*/, (unsigned int)port, &readStream, &writeStream);
Espero que isto seja útil. Aplauso. :)
 12
Author: 0yeoj, 2015-10-23 05:53:09