2015-09-24 22 views

risposta

84

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

Per disabilitare semplicemente ATS, è possibile seguire questa procedura per aprire Info.plist, e aggiungere le seguenti righe:

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

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

+1

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

+3

Sembra essere un'interpretazione errata comune, che NSAllowsArbitraryLoads è un interruttore per abilitare o disabilitare ATS. Non appena esegui una richiesta https: //, devi assicurarti di soddisfare i requisiti ATS: un certificato valido installato sul server (senza carattere jolly, corrispondente esattamente al nome di dominio del server), il server supporta TLS 1.2 con inoltro segretezza. – Christian

40

anche se permettono carichi arbitrari (NSAllowsArbitraryLoads = true) è una buona soluzione, si shouldn 't disattivare completamente ATS ma piuttosto consentire la connessione HTTP si desidera 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 di ignorare tutti i problemi di sicurezza. Il servizio S3 di Amazon utilizza una crittografia debole e il caricamento diretto sui loro server stava causando problemi, ma questo ci ha permesso di aprire solo l'URL s3.amazonaws.com, mantenendo il resto in linea. Eccezionale! – mix3d

14

iOS 9 connessioni forze che utilizzano HTTPS per essere TLS 1.2 per evitare le vulnerabilità più recenti. In iOS 8 sono state supportate anche le connessioni HTTP non crittografate, pertanto anche le versioni precedenti di TLS non presentavano alcun problema. Per risolvere il problema, è possibile aggiungere questo frammento di codice al tuo Info.plist:

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

* riferito a App Transport Security (ATS)

enter image description here

1

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.mydomain.com mentre il servizio che utilizzi viene eseguito su myservice.mydomain.com. Questa è una macchina diversa.

4

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

di riprodurre, ispezionare i UIWebView con Safari, e provare la navigazione verso un arbitrario HTTPS endpoint:

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 provare ad andare a google (perché ovviamente hanno un cert 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) risolve questo problema. Immagino anche che la disattivazione completa di NSAppTransportSecurity funzionerebbe anch'essa, anche se ho letto che disabilitarlo completamente può compromettere la revisione dell'app.

[EDIT] Ho trovato che enumerare semplicemente i domini a cui mi sto connettendo nel ditt NSExceptionDomains risolve questo problema, anche quando si lascia NSExceptionAllowsInsecureHTTPLoads impostato su true. : \

11

Se sono solo di mira domini specifici si può provare e aggiungere questo Info.plist dell'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> 
+0

Questo non ha funzionato per me. Sì, inserisco il dominio corretto per "esempio.com". – Alyoshak

+1

È lavoro per me. quando ho eseguito l'esempio solo con "Consenti carichi arbitrari", ma dopo l'interruzione. 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 usando la connessione https, ho ancora affrontato il problema. Al momento non è disponibile il supporto per "NSExceptionRequiresForwardSecrecy". Da quello che ho letto, questo non era necessario da specificare in precedenza, ma sembra che ora abbiano reso obbligatorio anche questo. PS: stavo provando con iOS 10.2.1 –

0

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

+0

l'ho già fatto. Ancora lo stesso errore –

+0

@AbdulYasin controlla il tuo plist e controlla che i cambiamenti climatici siano aggiornati o no? –

Problemi correlati