App Transport Security in Xamarin.iOS

App Transport Security (ATS) applica connessioni sicure tra le risorse Internet (ad esempio il server back-end dell'app) e l'app.

Questo articolo introduce le modifiche alla sicurezza applicate da App Transport Security a un'app iOS 9 e ciò che significa per i progetti Xamarin.iOS, illustra le opzioni di configurazione ats e illustra come rifiutare esplicitamente ATS ATS , se necessario. Poiché ATS è abilitato per impostazione predefinita, tutte le connessioni Internet non sicure genereranno un'eccezione nelle app iOS 9 (a meno che non sia stata esplicitamente consentita).

Informazioni su App Transport Security

Come indicato in precedenza, ATS garantisce che tutte le comunicazioni Internet in iOS 9 e OS X El Capitan siano conformi alle procedure consigliate per la connessione sicura, impedendo così la divulgazione accidentale di informazioni riservate direttamente tramite l'app o una libreria che sta consumando.

Per le app esistenti, implementare il HTTPS protocollo quando possibile. Per le nuove app Xamarin.iOS, è consigliabile usare HTTPS esclusivamente quando si comunica con le risorse Internet. Inoltre, la comunicazione API di alto livello deve essere crittografata usando TLS versione 1.2 con segreto d'inoltro.

Qualsiasi connessione effettuata con NSUrl Connessione ion, CFUrl o NSUrlSession userà ATS per impostazione predefinita nelle app compilate per iOS 9 e OS X 10.11 (El Capitan).

Comportamento predefinito di ATS

Poiché ATS è abilitato per impostazione predefinita nelle app compilate per iOS 9 e OS X 10.11 (El Capitan), tutte le connessioni che usano NSUrl Connessione ion, CFUrl o NSUrlSession saranno soggette ai requisiti di sicurezza di ATS. Se le connessioni non soddisfano questi requisiti, avranno esito negativo con un'eccezione.

Requisiti di ATS Connessione ion

ATS applichererà i requisiti seguenti per tutte le connessioni Internet:

  • Tutte le crittografie di connessione devono usare il segreto d'inoltro. Vedere l'elenco delle crittografie accettate di seguito.
  • Il protocollo Transport Layer Security (TLS) deve essere versione 1.2 o successiva.
  • Almeno un'impronta digitale SHA256 con una chiave RSA a 2048 bit o superiore oppure una chiave Elliptic-Curve (ECC) a 256 bit o superiore deve essere usata per tutti i certificati.

Anche in questo caso, poiché ATS è abilitato per impostazione predefinita in iOS 9, qualsiasi tentativo di stabilire una connessione che non soddisfa questi requisiti comporterà la generazione di un'eccezione.

Crittografie compatibili con ATS

Il seguente tipo di crittografia di segretezza inoltrata viene accettato dalle comunicazioni Internet protette da ATS:

  • TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384
  • TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256
  • TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384
  • TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA
  • TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256
  • TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA
  • TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384
  • TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
  • TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384
  • TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256
  • TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA

Per altre informazioni sull'uso delle classi di comunicazione Internet iOS, vedere Guida di riferimento alla classe NSURL Connessione ion di Apple o Riferimento alla classe NSURLSession.

Supporto di ATS in Xamarin.iOS

Poiché ATS è abilitato per impostazione predefinita in iOS 9 e OS X El Capitan, se l'app Xamarin.iOS o qualsiasi libreria o servizio che sta usando stabilisce la connessione a Internet, sarà necessario eseguire alcune azioni o le connessioni genereranno un'eccezione generata.

Per un'app esistente, Apple suggerisce di supportare il HTTPS protocollo il prima possibile. Se non è possibile perché ci si connette a un servizio Web di terze parti che non supporta o se il supporto HTTPSHTTPS sarebbe poco pratico, è possibile rifiutare esplicitamente ATS. Per altri dettagli, vedere la sezione Rifiuto esplicito di ATS più avanti.

Per una nuova app Xamarin.iOS, è consigliabile usare HTTPS esclusivamente quando si comunica con le risorse Internet. Anche in questo caso, potrebbero verificarsi situazioni come l'uso di un servizio Web di terze parti, in cui questo non è possibile e sarà necessario rifiutare esplicitamente ATS.

ATS impone inoltre la crittografia delle comunicazioni API di alto livello usando TLS versione 1.2 con segreto d'inoltro. Per altri dettagli, vedere le sezioni ats Connessione ion Requirements and ATS Compatible Ciphers (Requisiti per l'Connessione ats e le crittografie compatibili con ATS).

Anche se non si ha familiarità con TLS (Transport Layer Security) è il successore di SSL (Secure Socket Layer) e fornisce una raccolta di protocolli di crittografia per applicare la sicurezza sulle connessioni di rete.

Il livello TLS è controllato dal servizio Web che si sta utilizzando ed è quindi esterno al controllo dell'app. Sia il HttpClient che ModernHttpClient devono usare automaticamente il livello massimo di crittografia TLS supportato dal server.

A seconda del server a cui si sta parlando (soprattutto se si tratta di un servizio di terze parti), potrebbe essere necessario disabilitare la segretezza di inoltro o selezionare un livello TLS inferiore. Per altri dettagli, vedere la sezione Configurazione delle opzioni ATS di seguito.

Importante

App Transport Security non si applica alle app Xamarin che usano implementazioni HTTPClient gestite. Si applica alle connessioni che usano solo implementazioni HTTPClient di CFNetwork o implementazioni HTTPClient NSURLSession.

Impostazione dell'implementazione HTTPClient

Per impostare l'implementazione HTTPClient usata da un'app iOS, fare doppio clic sul progetto nel Esplora soluzioni per aprire le opzioni di progetto. Passare a Compilazione iOS e selezionare il tipo di client desiderato nell'elenco a discesa Implementazione httpClient:

Setting the iOS Build Options

Gestore gestito

Il gestore gestito è il gestore HttpClient completamente gestito fornito con le versioni precedenti di Xamarin.iOS ed è il gestore predefinito.

Vantaggi:

  • È la versione più compatibile con Microsoft .NET e la versione precedente di Xamarin.

Svantaggi:

  • Non è completamente integrato con iOS (ad esempio, è limitato a TLS 1.0).
  • In genere è molto più lento rispetto alle API native.
  • Richiede più codice gestito e crea app di dimensioni maggiori.

Gestore CFNetwork

Il gestore basato su CFNetwork si basa sul framework nativo CFNetwork .

Vantaggi:

  • Usa l'API nativa per ottenere prestazioni migliori e dimensioni eseguibili più piccole.
  • Aggiunge il supporto per gli standard più recenti, ad esempio TLS 1.2.

Svantaggi:

  • Richiede iOS 6 o versione successiva.
  • Non disponibile di watchOS.
  • Alcune funzionalità e opzioni httpClient non sono disponibili.

Gestore NSUrlSession

Il gestore basato su NSUrlSession si basa sull'API nativa NSUrlSession .

Vantaggi:

  • Usa l'API nativa per ottenere prestazioni migliori e dimensioni eseguibili più piccole.
  • Aggiunge il supporto per gli standard più recenti, ad esempio TLS 1.2.

Svantaggi:

  • Richiede iOS 7 o versione successiva.
  • Alcune funzionalità e opzioni httpClient non sono disponibili.

Diagnosi dei problemi di ATS

Quando si tenta di connettersi a Internet, direttamente o da una visualizzazione Web in iOS 9, è possibile che venga visualizzato un errore nel modulo:

App Transport Security ha bloccato un carico di risorse HTTP () non crittografato perchéhttp://www.-the-blocked-domain.com non è sicuro. Le eccezioni temporanee possono essere configurate tramite il file Info.plist dell'app.

In iOS9, App Transport Security (ATS) applica connessioni sicure tra le risorse Internet (ad esempio il server back-end dell'app) e l'app. ATS richiede inoltre la comunicazione tramite il HTTPS protocollo e la comunicazione api di alto livello per essere crittografata usando TLS versione 1.2 con segreto d'inoltro.

Poiché ATS è abilitato per impostazione predefinita nelle app create per iOS 9 e OS X 10.11 (El Capitan), tutte le connessioni che usano NSURLConnectionCFURL o NSURLSession saranno soggette ai requisiti di sicurezza di ATS. Se le connessioni non soddisfano questi requisiti, avranno esito negativo con un'eccezione.

Apple fornisce anche l'app di esempio TLSTool che può essere compilata (o facoltativamente transcodificata in Xamarin e C#) e usata per diagnosticare i problemi di ATS/TLS. Per informazioni su come risolvere questo problema, vedere la sezione Rifiuto esplicito di ATS di seguito.

Configurazione delle opzioni ATS

Puoi configurare diverse funzionalità di ATS impostando i valori per chiavi specifiche nel file Info.plist dell'app. Sono disponibili le chiavi seguenti per il controllo di ATS (rientrato per mostrare come sono annidate):

NSAppTransportSecurity
    NSAllowsArbitraryLoads
    NSAllowsArbitraryLoadsInWebContent
    NSExceptionDomains
    <domain-name-for-exception-as-string>
        NSExceptionMinimumTLSVersion
        NSExceptionRequiresForwardSecrecy
        NSExceptionAllowsInsecureHTTPLoads
        NSRequiresCertificateTransparency
        NSIncludesSubdomains
        NSThirdPartyExceptionMinimumTLSVersion
        NSThirdPartyExceptionRequiresForwardSecrecy
        NSThirdPartyExceptionAllowsInsecureHTTPLoads

Ogni chiave ha il tipo e il significato seguenti:

  • NSAppTransportSecurity (Dictionary): contiene tutte le chiavi e i valori di impostazione per ATS.
  • NSAllowsArbitraryLoads (Boolean): se YES ATS verrà disabilitato per qualsiasi dominio non elencato in NSExceptionDomains. Per i domini elencati, verranno usate le impostazioni di sicurezza specificate.
  • NSAllowsArbitraryLoadsInWebContent (Boolean) - Se YES consentirà il caricamento corretto delle pagine Web mentre la protezione di Apple Transport Security (ATS) è ancora abilitata per il resto dell'app.
  • N edizione Standard xceptionDomains (Dictionary): raccolta di domini che e le impostazioni di sicurezza che ATS devono usare per un determinato dominio.
  • <domain-name-for-exception-as-string> (Dictionary): raccolta di eccezioni per un determinato dominio (ad esempio). www.xamarin.com
  • N edizione Standard xceptionMinimumTLSVersion (String) - Versione minima di TLS come TLSv1.0o TLSv1.1TLSv1.2 (impostazione predefinita).
  • N edizione Standard xceptionRequiresForwardSecrecy (Boolean) - Se NO il dominio non deve usare una crittografia con sicurezza avanzata. Il valore predefinito è YES.
  • N edizione Standard xceptionAllowsInsecureHTTPLoads (Boolean) - Se NO (impostazione predefinita) tutte le comunicazioni con questo dominio devono trovarsi nel HTTPS protocollo.
  • NSRequiresCertificateTransparency (Boolean): se YES il livello SSL (Secure Sockets Layer) del dominio deve includere dati di trasparenza validi. Il valore predefinito è NO.
  • NSIncludesSubdomains (Boolean): se YES queste impostazioni sostituiscono tutti i sottodomini del dominio. Il valore predefinito è NO.
  • NSThirdPartyExceptionMinimumTLSVersion (String) - Versione TLS usata quando il dominio è un servizio di terze parti al di fuori del controllo dello sviluppatore.
  • NSThirdPartyExceptionRequiresForwardSecrecy (Boolean) - Se YES un dominio di terze parti richiede la segretezza avanzata.
  • NSThirdPartyExceptionAllowsInsecureHTTPLoads (Boolean) - Se YES ATS consentirà la comunicazione non sicura con domini di terze parti.

Rifiuto esplicito di ATS

Anche se Apple suggerisce vivamente l'uso del protocollo e la HTTPS comunicazione sicura con le informazioni basate su Internet, potrebbe capitare che questo non sia sempre possibile. Ad esempio, se stai comunicando con un servizio Web di terze parti o utilizzando annunci forniti da Internet nella tua app.

Se l'app Xamarin.iOS deve effettuare una richiesta a un dominio non sicuro, le modifiche seguenti al file Info.plist dell'app disabiliteranno le impostazioni predefinite di sicurezza applicate da ATS per un determinato dominio:

<key>NSAppTransportSecurity</key>
<dict>
    <key>NSExceptionDomains</key>
    <dict>
        <key>www.the-domain-name.com</key>
        <dict>
            <key>NSExceptionMinimumTLSVersion</key>
            <string>TLSv1.0</string>
            <key>NSExceptionRequiresForwardSecrecy</key>
            <false/>
            <key>NSExceptionAllowsInsecureHTTPLoads</key>
            <true/>
            <key>NSIncludesSubdomains</key>
            <true/>
        </dict>
    </dict>
</dict>

All'interno di Visual Studio per Mac fare doppio clic sul Info.plist file nella Esplora soluzioni, passare alla visualizzazione Origine e aggiungere le chiavi precedenti:

The Source view of the Info.plist file after adding specified keys.

Se l'app deve caricare e visualizzare contenuto Web da siti non sicuri, aggiungere quanto segue al file Info.plist dell'app per consentire il caricamento corretto delle pagine Web mentre la protezione di Apple Transport Security (ATS) è ancora abilitata per il resto dell'app:

<key>NSAppTransportSecurity</key>
<dict>
    <key> NSAllowsArbitraryLoadsInWebContent</key>
    <true/>
</dict>

Facoltativamente, puoi apportare le modifiche seguenti al file Info.plist dell'app per disabilitare completamente ATS per tutti i domini e le comunicazioni Internet:

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

All'interno di Visual Studio per Mac fare doppio clic sul Info.plist file nella Esplora soluzioni, passare alla visualizzazione Origine e aggiungere le chiavi precedenti:

The Source view of the Info.plist file after specifying NSAllowsArbitraryLoadsInWebContent and NSAllowsArbitraryLoads.

Importante

Se l'applicazione richiede una connessione a un sito Web non sicuro, è consigliabile immettere sempre il dominio come eccezione usando NSExceptionDomains invece di disattivare completamente ATS usando NSAllowsArbitraryLoads. NSAllowsArbitraryLoads deve essere utilizzato solo in situazioni di emergenza estreme.

Anche in questo caso, la disabilitazione di ATS deve essere usata solo come ultima risorsa, se il passaggio a connessioni sicure non è disponibile o poco pratico.

Riepilogo

Questo articolo ha introdotto App Transport Security (ATS) e descritto il modo in cui applica comunicazioni sicure con Internet. In primo luogo, sono state illustrate le modifiche richieste da ATS per un'app Xamarin.iOS in esecuzione in iOS 9. È stato quindi esaminato il controllo delle funzionalità e delle opzioni di ATS. Infine, è stato illustrato il rifiuto esplicito di ATS nell'app Xamarin.iOS.