Como é que carrego um URL de HTTP com a segurança do transporte da aplicação activada no iOS 9? [duplicado]
- a segurança do transporte bloqueou um cleartext HTTP 23 respostas
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?
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.
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>
Depois disto.
Resolvi-o adicionando uma chave na informação.plist. Os passos que segui são:Abriu o meu ficheiro de projectos
info.plist
Adicionou uma chave chamada
NSAppTransportSecurity
comoDictionary
.- adicionou uma sub-chave chamada
NSAllowsArbitraryLoads
comoBoolean
e fixou o seu valor emYES
como se fosse a seguinte imagem.
Ref Link .
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.
<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>
<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>
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:
<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. :)