Da quando ho aggiornato il mio progetto esistente con iOS 9, continuo a ricevere l'errore:
Si è verificato un errore SSL e non è possibile stabilire una connessione sicura al server.
Da quando ho aggiornato il mio progetto esistente con iOS 9, continuo a ricevere l'errore:
Si è verificato un errore SSL e non è possibile stabilire una connessione sicura al server.
Risposte:
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>
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>
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)
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>
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 NSAppTransportSecurity
funzionerebbe, 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 NSExceptionDomains
dict risolve questo problema, anche quando si lascia NSExceptionAllowsInsecureHTTPLoads
impostato su true. : \
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.
Ottengo lo stesso errore quando specifico il mio URL HTTPS come: https://www.mywebsite.com . Tuttavia funziona bene quando lo specifico senza le tre W come: https://mywebsite.com .
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
Il mio problema era NSURLConnection
e quello era deprecato in iOS9, quindi ho cambiato tutte le API in NSURLSession
e questo ha risolto il mio problema.
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.
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.