iOS9 riceve l'errore "si è verificato un errore SSL e non è possibile stabilire una connessione sicura al server"


Risposte:


123

Per iOS9, Apple ha preso una decisione radicale con iOS 9, disabilitando tutto il traffico HTTP non protetto dalle app iOS, come parte di App Transport Security (ATS) .

Per disabilitare semplicemente ATS, puoi seguire questi passaggi aprendo Info.plist e aggiungere le seguenti righe:

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

45
Ho aggiunto le righe sopra in plist, ma ricevo ancora il seguente errore: si è verificato un errore SSL e non è possibile stabilire una connessione sicura al server. NSLocalizedRecoverySuggestion = Vuoi connetterti comunque al server ?, _kCFNetworkCFStreamSSLErrorOriginalValue = -9819 Sto chiamando una richiesta HTTPS. C'è qualche altra opzione per HTTPS?
AiOsN

1
AiOsN = stesso problema qui, hai trovato una soluzione?
Franck

5
Sembra essere un'interpretazione errata comune, che NSAllowsArbitraryLoads sia un interruttore per abilitare o disabilitare ATS. Non appena si esegue una richiesta https: //, è necessario assicurarsi di soddisfare i requisiti ATS: un certificato valido installato sul server (senza carattere jolly, che corrisponde esattamente al nome di dominio del server), il server supporta TLS 1.2 con forward segretezza.
Christian

@Christian Qual è la fonte di questi requisiti ATS? Non riesco a trovare nulla sul mancato supporto dei certificati con caratteri jolly.
Bart

@Bartosz Mi dispiace, non posso indicarti un documento ufficiale, è solo qualcosa che abbiamo osservato durante l'aggiornamento della nostra infrastruttura di server.
Christian

64

Anche se consentire caricamenti arbitrari ( NSAllowsArbitraryLoads = true) è una buona soluzione alternativa, non dovresti disabilitare completamente ATS ma piuttosto abilitare la connessione HTTP che desideri consentire:

<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>

2
Molto meglio che ignorare tutti i problemi di sicurezza. Il servizio S3 di Amazon utilizza una crittografia debole e il caricamento diretto sui server causava problemi, ma questo ci ha permesso di aprire solo l'URL di s3.amazonaws.com, mantenendo il resto in linea. Eccezionale!
mix3d

3
Il server che stavo cercando di raggiungere utilizzava TLSv1.0. Ho dovuto aggiungere NSExceptionMinimumTLSVersion per tls1.0 per bypassare l'errore SLL
Ispas Claudiu

Questa risposta ha funzionato per me. Stavo usando un WKWebView e stavo cercando di fare una richiesta SSL al server API.
Fan Jin il

Ciao @ Stéphane, ho una situazione strana. Il mio telefono ha la versione iOS 12.1.2, ma ho ricevuto l'errore "Si è verificato un errore SSL e non è possibile stabilire una connessione sicura al server". Quello che ho fatto è stato aggiornato il mio file plist. L'app funziona bene e di nuovo ho rimosso le modifiche apportate in info.plist. Ora sta funzionando bene. Quindi, non sono in grado di trovare il motivo effettivo di questo errore. Qualche suggerimento?
Mansuu ...

@Mansuu .... hai provato ad utilizzare TLSv1.0 come suggerito nei commenti sopra?
Stéphane Bruckert

15

iOS 9 impone che le connessioni che utilizzano HTTPS siano TLS 1.2 per evitare le recenti vulnerabilità. In iOS 8 erano supportate anche le connessioni HTTP non crittografate, quindi anche le versioni precedenti di TLS non creavano problemi. Come soluzione alternativa, puoi aggiungere questo snippet di codice al tuo Info.plist:

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

* riferito ad App Transport Security (ATS)

inserisci qui la descrizione dell'immagine


1
Per Swift 4+, Impostazioni di sicurezza del trasporto delle app -> Consenti
caricamenti

14

Se stai prendendo di mira solo domini specifici, puoi provare ad aggiungerlo nel Info.plist della tua applicazione:

<key>NSAppTransportSecurity</key>
<dict>
    <key>NSExceptionDomains</key>
    <dict>
        <key>example.com</key>
        <dict>
            <key>NSExceptionRequiresForwardSecrecy</key>
            <false/>
            <key>NSIncludesSubdomains</key>
            <true/>
        </dict>
    </dict>
</dict>

Questo non ha funzionato per me. Sì, ho inserito il dominio corretto in "example.com".
Alyoshak

1
È lavoro per me. quando ho fatto l'esempio solo con "Consenti carichi arbitrari" funziona ma dopo si è fermato. Quando ho usato la chiave "NSExceptionRequiresForwardSecrecy" -> false e "NSIncludesSubdomains" -> true funziona perfettamente. Molte grazie!
linhadiretalipe

1
Questo ha funzionato anche per me! Anche se sto utilizzando una connessione https, ho comunque riscontrato il problema. Al momento non è disponibile alcun supporto per "NSExceptionRequiresForwardSecrecy". Da quello che ho letto, non era necessario specificarlo in precedenza, ma sembra che lo abbiano reso obbligatorio anche ora. PS: stavo provando con iOS 10.2.1
Vaibhav Misra

6

Sembra che iOS 9.0.2 interrompa le richieste a endpoint HTTPS validi. Il mio sospetto attuale è che stia richiedendo certificati SHA-256 o che fallisca con questo errore.

Per riprodurre, ispeziona la tua UIWebView con Safari e prova a navigare verso un endpoint HTTPS arbitrario:

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)

Ora prova ad andare su Google (perché ovviamente hanno un certificato SHA-256):

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

L'aggiunta di un'eccezione alla sicurezza del trasporto (come delineato dalla risposta di @ stéphane-bruckert sopra) funziona per risolvere questo problema. Presumo anche che anche la disabilitazione completa NSAppTransportSecurityfunzionerebbe, anche se ho letto che disabilitarla completamente può mettere a repentaglio la revisione dell'app.

[EDIT] Ho scoperto che la semplice enumerazione dei domini a cui mi connetto nel NSExceptionDomainsdict risolve questo problema, anche quando si lascia NSExceptionAllowsInsecureHTTPLoadsimpostato su true. : \


2

Il problema è il certificato SSL sul lato server. O qualcosa sta interferendo o il certificato non corrisponde al servizio. Ad esempio, quando un sito ha un certificato SSL per www.miodominio.com mentre il servizio che utilizzi viene eseguito su mioservizio.miodominio.com. Questa è una macchina diversa.


Sto riscontrando il problema con alcuni URL ma non altri allo stesso indirizzo IP (dominio e server)
user6631314


0

Progetto Xcode -> goto info.plist e fai clic sul pulsante + quindi Aggiungi (Impostazioni di sicurezza del trasporto app) Espandi, Consenti caricamenti arbitrari Imposta SÌ. Grazie


@AbdulYasin controlla il tuo plist e controlla che i cambiamenti del tempo siano aggiornati o no?
Shanmugasundharam

1
Questa risposta "rilassata" omette completamente la spiegazione ei rischi per la sicurezza associati a questa soluzione alternativa.
Manuel


0

Nel mio caso ho riscontrato questo problema nel mio simulatore perché la data del mio computer era in ritardo rispetto alla data corrente. Quindi controlla anche questo caso quando incontri un errore SSL.


0

Ricevo l'errore di seguito durante la riproduzione

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>

Mi sono assicurato di aver aggiunto la voce nei domini di eccezione nel file plist e NSAllowsArbitraryLoads è impostato su true e ancora stavo vedendo un errore.

Poi ho capito che sto riproducendo URL con https e non con http.

Ho impostato l'URL del video su http e il problema è stato risolto.


0

Ho ricevuto questo errore per alcune chiamate di rete e non per altre. Ero connesso a un wifi pubblico. Quel wifi gratuito sembrava manomettere alcuni URL e quindi l'errore.

Quando mi sono connesso a LTE quell'errore è andato via!

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.