iOS9 recebendo o erro “ocorreu um erro de SSL e não foi possível estabelecer uma conexão segura com o servidor”

Respostas:

123

Para o iOS9, a Apple tomou uma decisão radical com o iOS 9, desabilitando todo o tráfego HTTP inseguro de aplicativos iOS, como parte do App Transport Security (ATS) .

Para simplesmente desativar o ATS, você pode seguir estas etapas abrindo Info.plist e adicionar as seguintes linhas:

<key>NSAppTransportSecurity</key>
  <dict>
      <key>NSAllowsArbitraryLoads</key>
      <true/>
  </dict>
Tony TRAN
fonte
45
Eu adicionei as linhas acima no plist, mas ainda obtenho o seguinte erro: Ocorreu um erro de SSL e uma conexão segura com o servidor não pode ser feita. NSLocalizedRecoverySuggestion = Deseja se conectar ao servidor mesmo assim ?, _kCFNetworkCFStreamSSLErrorOriginalValue = -9819 Estou chamando a solicitação HTTPS. Existe alguma outra opção para HTTPS?
AiOsN
1
AiOsN = mesmo problema aqui, você encontrou uma solução?
Franck
5
Parece ser uma má interpretação comum, que NSAllowsArbitraryLoads é uma chave para habilitar ou desabilitar ATS. Assim que estiver fazendo uma solicitação https: //, você deve garantir que atende aos requisitos ATS: um certificado válido instalado no servidor (sem curinga, correspondendo exatamente ao nome de domínio do servidor), o servidor suporta TLS 1.2 com encaminhamento segredo.
Christian
@Christian Qual é a fonte desses requisitos ATS? Não consigo encontrar nada sobre o não suporte a certificados curinga.
Bart
@Bartosz Desculpe, não posso apontar um documento oficial, é apenas algo que observamos ao atualizar nossa infraestrutura de servidor.
Christian
64

Mesmo que permitir cargas arbitrárias ( NSAllowsArbitraryLoads = true) seja uma boa solução alternativa, você não deve desativar totalmente o ATS, mas sim ativar a conexão HTTP que deseja permitir:

<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>
Stéphane Bruckert
fonte
2
Muito melhor do que ignorar todos os problemas de segurança. O serviço S3 da Amazon usa criptografia fraca e carregar diretamente em seus servidores estava causando problemas, mas isso nos permitiu abrir apenas o url s3.amazonaws.com, mantendo o restante embutido. Impressionante!
mix3d
3
O servidor que eu estava tentando acessar estava usando TLSv1.0. Tive que adicionar NSExceptionMinimumTLSVersion para tls1.0 para contornar o erro SLL
Ispas Claudiu
Essa resposta funcionou para mim. Eu estava usando um WKWebView e tentando fazer uma solicitação SSL para o servidor API.
Fan Jin
Olá @ Stéphane, estou com uma situação estranha. Meu telefone tem a versão 12.1.2 do iOS, mas recebo o erro "Ocorreu um erro de SSL e não foi possível estabelecer uma conexão segura com o servidor". O que fiz foi atualizar meu arquivo plist. O aplicativo funcionou bem e, novamente, removi as alterações que fiz no info.plist. Agora está funcionando bem. Portanto, não consigo encontrar o verdadeiro motivo desse erro. Alguma sugestão?
Mansuu ....
@Mansuu .... você tentou usar o TLSv1.0 conforme sugerido nos comentários acima?
Stéphane Bruckert
15

O iOS 9 força conexões que usam HTTPS a serem TLS 1.2 para evitar vulnerabilidades recentes. No iOS 8, até mesmo conexões HTTP não criptografadas eram suportadas, de modo que as versões anteriores do TLS também não causavam problemas. Como alternativa, você pode adicionar este snippet de código ao seu Info.plist:

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

* referenciado a App Transport Security (ATS)

insira a descrição da imagem aqui

TechSeeko
fonte
1
Para Swift 4+, App Transport Security Settings -> Allow Arbitrary Loads = YES
mehdigriche
14

Se você está apenas almejando domínios específicos, pode tentar adicionar isso ao Info.plist do seu aplicativo:

<key>NSAppTransportSecurity</key>
<dict>
    <key>NSExceptionDomains</key>
    <dict>
        <key>example.com</key>
        <dict>
            <key>NSExceptionRequiresForwardSecrecy</key>
            <false/>
            <key>NSIncludesSubdomains</key>
            <true/>
        </dict>
    </dict>
</dict>
Nathan Noble
fonte
Isto não funcionou para mim. Sim, coloquei o domínio correto em "exemplo.com".
Alyoshak
1
É trabalho para mim. quando fiz o exemplo apenas com os trabalhos "Permitir Cargas Arbitrárias" mas depois parei. Quando usei a chave "NSExceptionRequiresForwardSecrecy" -> false e "NSIncludesSubdomains" -> true, funcionou perfeitamente. Muito obrigado!
linhadiretalipe
1
Isso funcionou para mim também! Mesmo usando a conexão https, ainda enfrento o problema. Não há suporte para 'NSExceptionRequiresForwardSecrecy' atualmente. Pelo que li, não foi necessário especificar antes, mas parece que agora também é obrigatório. PS: Eu estava tentando com iOS 10.2.1
Vaibhav Misra
6

Parece que o iOS 9.0.2 interrompe as solicitações para endpoints HTTPS válidos. Minha suspeita atual é que ele está exigindo certificados SHA-256 ou falha com este erro.

Para reproduzir, inspecione seu UIWebView com safari e tente navegar para um ponto de extremidade HTTPS arbitrário:

location.href = "https://d37gvrvc0wt4s1.cloudfront.net/js/v1.4/rollbar.min.js"
// [Error] Failed to load resource: An SSL error has occurred and a secure connection to the server cannot be made. (rollbar.min.js, line 0)

Agora tente ir ao google (porque é claro que eles têm um certificado SHA-256):

location.href = "https://google.com"
// no problemo

Adicionar uma exceção à segurança de transporte (conforme descrito pela resposta de @stéphane-bruckert acima) corrige isso. Eu também presumo que a desativação completa NSAppTransportSecurityfuncionaria também, embora eu tenha lido que desativá-la completamente pode prejudicar a análise do seu aplicativo.

[EDIT] Descobri que simplesmente enumerar os domínios aos quais estou me conectando no NSExceptionDomainsdicionário corrige o problema, mesmo quando NSExceptionAllowsInsecureHTTPLoadsdefinido como verdadeiro. : \

Steve
fonte
2

O problema é o certificado SSL no lado do servidor. Algo está interferindo ou o certificado não corresponde ao serviço. Por exemplo, quando um site tem um certificado SSL para www.mydomain.com enquanto o serviço que você usa é executado em myservice.mydomain.com. Essa é uma máquina diferente.

Helge Becker
fonte
Estou recebendo o problema com alguns urls, mas não com outros no mesmo endereço IP (domínio e servidor)
user6631314
0

Projeto Xcode -> goto info.plist e clique no botão + e depois em Adicionar (Configurações de segurança de transporte do aplicativo) Expanda, Permitir cargas arbitrárias, defina YES. obrigado

Shanmugasundharam
fonte
@AbdulYasin verifique seu plist e verifique se as mudanças climáticas estão atualizadas ou não?
Shanmugasundharam
1
Essa resposta "descontraída" omite totalmente a explicação e os riscos de segurança associados a essa solução alternativa.
Manuel
0

Meu problema era NSURLConnectione foi descontinuado no iOS9, então mudei toda a API para NSURLSessione isso corrigiu meu problema.

NSURLConnection obsoleto no iOS9

Akila Wasala
fonte
0

No meu caso, enfrentei esse problema no meu simulador porque a data do meu computador estava atrasada em relação à data atual. Portanto, verifique também este caso quando encontrar um erro de SSL.

Teena Nath Paul
fonte
0

Eu estava recebendo um erro abaixo da reprodução

finished with error [-1200] Error Domain=NSURLErrorDomain Code=-1200 "An SSL error has occurred and a secure connection to the server cannot be made." UserInfo={NSErrorFailingURLStringKey=https://remote-abcabc-svc.an.abc.com:1935/abr/_definst_/smil:v2/video/492F2F82592F59EA74ABAA6B9D6E6F42/F6B1BD452132329FBACD32730862CAE0/091EAD80FE9BEDD52A2F33840CA3CBAC.v3.eng.smil/playlist.m3u8, NSLocalizedRecoverySuggestion=Would you like to connect to the server anyway?, _kCFStreamErrorDomainKey=3, _NSURLErrorFailingURLSessionTaskErrorKey=LocalDataTask <692A1174-DA1C-4267-9560-9020A79F8458>.<1>, _NSURLErrorRelatedURLSessionTaskErrorKey=(
    "LocalDataTask <692A1174-DA1C-4267-9560-9020A79F8458>

Verifiquei se adicionei a entrada em domínios de exceção no arquivo plist e NSAllowsArbitraryLoads está definido como verdadeiro e ainda estava vendo um erro.

Então percebi que estou jogando URL com https e não http.

Defini o url do vídeo como http e o problema foi resolvido.

Naren
fonte
0

Eu estava recebendo este erro para algumas chamadas de rede e não para outras. Eu estava conectado a um wi-fi público. Esse wi-fi gratuito parecia estar adulterando certos URLs e, portanto, o erro.

Quando me conectei ao LTE, aquele erro foi embora!

Mel
fonte