ios - google - hsts preload list search




La sicurezza del trasporto ha bloccato un HTTP in chiaro (17)

Esempio di sviluppo

Ecco uno screenshot di un plist che mantiene intatto ATS (= sicuro), ma che consente di stabilire connessioni a localhost tramite HTTP anziché HTTPS . Funziona in Xcode 7.1.1.

Quale impostazione devo inserire nel mio info.plist per abilitare la modalità HTTP secondo il seguente messaggio di errore?

La sicurezza del trasporto ha bloccato un carico di risorse HTTP (http: //) in chiaro poiché non è sicuro. Eccezioni temporanee possono essere configurate tramite il file Info.plist della tua app.

Supponiamo che il mio dominio sia example.com .


Come molti hanno notato, questo è un problema di funzionalità fornito con iOS 9.0. Hanno aggiunto una cosa chiamata App Transport Security, e anche io ero infastidito quando ha rotto le mie app.

Puoi bendarlo con la chiave NSAllowsArbitraryLoads su YES nel dizionario NSAppTransportSecurity nel tuo file .plist, ma alla fine dovrai riscrivere il codice che forma i tuoi URL per formare il prefisso HTTPS: //.

Apple ha riscritto la classe NSUrlConnection in iOS 9.0. Puoi leggerlo in NSURLConnection .

Altrimenti, potrebbe essere necessario uscire da iOS 9.0 fino a quando non si ha il tempo di implementare la soluzione corretta.


Aggiornamento per Xcode 7.1, affrontando il problema 27.10.15:

Il nuovo valore in Info.plist è "Impostazioni di sicurezza del trasporto app". Da lì, questo dizionario dovrebbe contenere:

  • Consenti carichi arbitrari = SÌ
  • Domini di eccezione (inserisci qui il tuo dominio http)

Capire quali impostazioni utilizzare possono essere eseguite automaticamente, come menzionato in questo technote :

/usr/bin/nscurl --ats-diagnostics --verbose https://your-domain.com

In swift 4 e xocde 10 è necessario modificare NSAllowsArbitraryLoads per consentire carichi arbitrari. quindi sarà simile a questo:

<key>NSAppTransportSecurity</key>
<dict>
    <key>NSExceptionDomains</key>
    <dict>
        <key>www.xxx.yyy.zzz</key>
        <dict>
            <key>NSExceptionAllowsInsecureHTTPLoads</key>
            <true/>
            <key>NSExceptionMinimumTLSVersion</key>
            <string>TLSv1.1</string>
            <key>NSIncludesSubdomains</key>
            <true/>
        </dict>
    </dict>
</dict>

L'uso di NSExceptionDomains potrebbe non applicare un effetto contemporaneamente a causa del sito di destinazione che potrebbe caricare risorse (ad esempio file js ) da domini esterni su http . Può essere risolto aggiungendo anche questi domini esterni a NSExceptionDomains .

Per verificare quali risorse non possono essere caricate, provare a utilizzare il debug remoto. Ecco un tutorial: http://geeklearning.io/apache-cordova-and-remote-debugging-on-ios/


NOTA: il dominio dell'eccezione nel plist dovrebbe essere in LOWER-CASE.

Esempio: hai chiamato la tua macchina "MyAwesomeMacbook" in Impostazioni-> Condivisione; il tuo server (a scopo di test) è in esecuzione su MyAwesomeMacbook.local: 3000 e la tua app deve inviare una richiesta a http: //MyAwesomeMacbook.local: 3000 / files ..., devi specificare "myawesomemacbook. local "come dominio di eccezione.

-

La tua info.plist conterrebbe ...

<key>NSAppTransportSecurity</key>
<dict>
    <key>NSExceptionDomains</key>
    <dict>
        <key>www.xxx.yyy.zzz</key>
        <dict>
            <key>NSTemporaryExceptionAllowsInsecureHTTPLoads</key>
            <true/>
            <key>NSTemporaryExceptionMinimumTLSVersion</key>
            <string>TLSv1.1</string>
            <key>NSIncludesSubdomains</key>
            <true/>
        </dict>
    </dict>
</dict>

Non mi piace modificare direttamente il plist. Puoi facilmente aggiungerlo al plist usando la GUI:

  • Fai clic su Info.plist nel Navigator a sinistra.
  • Ora cambia i dati nell'area principale:

    • Nell'ultima riga aggiungi il +
    • Immettere il nome del gruppo: Impostazioni sicurezza trasporto app
    • Fare clic con il tasto destro sul gruppo e selezionare Add Row
    • Immettere Consenti carichi arbitrari
    • Impostare il valore a destra su


Per coloro che sono venuti qui cercando di trovare il motivo per cui il loro WKWebView è sempre bianco e non carica nulla (esattamente come descritto qui come faccio a far funzionare WKWebView in modo rapido e per un'app macOS ):

Se tutta la scienza missilistica di cui sopra non funziona per te, controlla l'ovvio: le impostazioni sandbox

Essendo nuovo per il rapido e il cacao, ma piuttosto esperto nella programmazione, ho impiegato circa 20 ore per trovare questa soluzione. Nessuna dozzina di tutorial iOS per hipster o note chiave di Apple: nulla menziona questa piccola casella di controllo.


Per impostazione predefinita, iOS consente solo l'API HTTPS. Poiché HTTP non è sicuro, dovrai disabilitare la sicurezza del trasporto delle app. Esistono due modi per disabilitare ATS: -

1. Aggiunta del codice sorgente nel progetto info.plist e aggiunta del codice seguente nel tag root.

"NSAppTransportSecurity": [
   {
      "xml": "<dict><key>NSAllowsArbitraryLoads</key><true /></dict>"
   }
]

2. Utilizzo delle informazioni sul progetto.

Fare clic sul progetto nel progetto a sinistra, selezionare il progetto come destinazione e selezionare la scheda informazioni. Devi aggiungere il dizionario nella seguente struttura.


Questa è una soluzione rapida (ma non consigliata) per aggiungere questo nel plist:

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

Il che significa (secondo la documentazione di Apple ):

NSAllowsArbitraryLoads
Un valore booleano utilizzato per disabilitare la sicurezza del trasporto app per tutti i domini non elencati nel dizionario NSExceptionDomains. I domini elencati utilizzano le impostazioni specificate per quel dominio.

Il valore predefinito NO richiede il comportamento predefinito Sicurezza trasporto app per tutte le connessioni.

Consiglio vivamente i collegamenti:

che mi aiuta a capire le ragioni e tutte le implicazioni.

L'XML (nel file Info.plist) di seguito:

<key>NSAppTransportSecurity</key>
<dict>
    <key>NSAllowsArbitraryLoads</key>
    <false/>
    <key>NSExceptionDomains</key>
    <dict>
        <key>PAGE_FOR_WHICH_SETTINGS_YOU_WANT_TO_OVERRIDE</key>
        <dict>
            <key>NSExceptionAllowsInsecureHTTPLoads</key>
            <true/>
        </dict>
    </dict>
</dict>

non consentire chiamate arbitrarie per tutte le pagine, ma per PAGE_FOR_WHICH_SETTINGS_YOU_WANT_TO_OVERRIDE consentirà che le connessioni utilizzino il protocollo HTTP.

All'XML sopra puoi aggiungere:

<key>NSIncludesSubdomains</key>
<true/>

se si desidera consentire connessioni non sicure per i sottodomini dell'indirizzo specificato.

L'approccio migliore è bloccare tutti i carichi arbitrari (impostato su false) e aggiungere eccezioni per consentire solo gli indirizzi che sappiamo siano a posto.

Per i lettori interessati

Aggiornamento 2018:

Apple non sta raccomandando di disattivarlo: ulteriori informazioni sono disponibili nella sessione WWDC 2018 del 207 con ulteriori spiegazioni in merito alla sicurezza

Lasciare la risposta originale per ragioni storiche e fase di sviluppo


Questo è stato testato e funzionava su seed GM iOS 9: questa è la configurazione che consente a un dominio specifico di utilizzare HTTP anziché HTTPS:

<key>NSAppTransportSecurity</key>
<dict>
      <key>NSAllowsArbitraryLoads</key> 
      <false/>
       <key>NSExceptionDomains</key>
       <dict>
            <key>example.com</key> <!--Include your domain at this line -->
            <dict>
                <key>NSIncludesSubdomains</key>
                <true/>
                <key>NSTemporaryExceptionAllowsInsecureHTTPLoads</key>
                <true/>
                <key>NSTemporaryExceptionMinimumTLSVersion</key>
                <string>TLSv1.1</string>
            </dict>
       </dict>
</dict>

NSAllowsArbitraryLoads deve essere false , poiché non consente tutte le connessioni non NSAllowsArbitraryLoads , ma l'elenco delle eccezioni consente la connessione ad alcuni domini senza HTTPS.


Secondo Apple, in genere la disabilitazione di ATS comporterà il rifiuto delle app, a meno che tu non abbia una buona ragione per farlo. Anche in questo caso, è necessario aggiungere eccezioni per i domini ai quali è possibile accedere in modo sicuro.

Apple ha uno strumento eccellente che ti dice esattamente quali impostazioni usare: in Terminale, inserisci

/usr/bin/nscurl --ats-diagnostics --verbose https://www.example.com/whatever

e nscurl verificherà se questa richiesta ha esito negativo, quindi prova una varietà di impostazioni e ti dirà esattamente quale passa e cosa fare. Ad esempio, per alcuni URL di terze parti che visito, questo comando mi ha detto che questo dizionario passa:

{
    NSExceptionDomains = {
        "www.example.com" = {
            NSExceptionRequiresForwardSecrecy = false;
        };
    };
}

Per distinguere tra i tuoi siti e quelli di terze parti che sono fuori dal tuo controllo, usa, ad esempio, la chiave NSThirdPartyExceptionRequiresForwardSecrecy.


Usa NSAppTransportSecurity:

Devi impostare la chiave NSAllowsArbitraryLoads su YES nel dizionario NSAppTransportSecurity nel tuo file info.plist.


Vai al tuo Info.plist

  1. Fare clic destro su spazio vuoto e fare clic su Aggiungi riga
  2. Scrivi il nome chiave come NSAppTransportSecurity, sotto di esso
  3. Seleziona Domini di eccezione, aggiungi un nuovo elemento a questo
  4. Scrivi il tuo nome di dominio a cui devi accedere
  5. Cambia il tipo di dominio da stringa a dizionario, aggiungi un nuovo elemento
  6. NSTemporaryExceptionAllowsInsecureHTTPLoads, che sarà un valore booleano con un valore vero.

Vale la pena ricordare come arrivarci ...

Info.plist è uno dei file sotto Main.storyboard o viewController.swift.

Quando fai clic su di esso per la prima volta, di solito è in un formato tabella, quindi fai clic con il pulsante destro del mouse sul file e 'apri come' Codice sorgente, quindi aggiungi il codice in basso verso la fine, ovvero:

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

Copia incolla il codice appena sopra

 "</dict>
</plist>"

che è alla fine.


Esistono due soluzioni per questo:

Soluzioni 1:

  1. Nel file Info.plist aggiungi un dizionario con la chiave ' NSAppTransportSecurity '
  2. Aggiungi un altro elemento all'interno del dizionario con il tasto 'Allow Arbitrary Loads'

Plist struttura del Plist dovrebbe apparire come mostrato nell'immagine seguente.

Soluzione 2:

  1. Nel file Info.plist aggiungi un dizionario con la chiave ' NSAppTransportSecurity '
  2. Aggiungi un altro elemento all'interno del dizionario con la chiave ' NSExceptionDomains '
  3. Aggiungi elemento con chiave 'MyDomainName.com' di tipo NSDictionary
  4. Aggiungi elemento con chiave ' NSIncludesSubdomains ' di tipo Boolean e valore impostato come YES
  5. Aggiungi elemento con chiave ' NSTemporaryExceptionAllowsInsecureHTTPLoads ' di tipo Boolean e valore impostato come YES

Plist struttura del Plist dovrebbe apparire come mostrato nell'immagine seguente.

La soluzione 2 è preferita poiché consente solo il dominio selezionato, mentre la soluzione 1 consente tutte le connessioni HTTP non sicure.





app-transport-security