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 HTTPS
HTTPS
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:
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 NSURLConnection
CFURL
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
): seYES
ATS verrà disabilitato per qualsiasi dominio non elencato inNSExceptionDomains
. Per i domini elencati, verranno usate le impostazioni di sicurezza specificate. - NSAllowsArbitraryLoadsInWebContent (
Boolean
) - SeYES
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 comeTLSv1.0
oTLSv1.1
TLSv1.2
(impostazione predefinita). - N edizione Standard xceptionRequiresForwardSecrecy (
Boolean
) - SeNO
il dominio non deve usare una crittografia con sicurezza avanzata. Il valore predefinito èYES
. - N edizione Standard xceptionAllowsInsecureHTTPLoads (
Boolean
) - SeNO
(impostazione predefinita) tutte le comunicazioni con questo dominio devono trovarsi nelHTTPS
protocollo. - NSRequiresCertificateTransparency (
Boolean
): seYES
il livello SSL (Secure Sockets Layer) del dominio deve includere dati di trasparenza validi. Il valore predefinito èNO
. - NSIncludesSubdomains (
Boolean
): seYES
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
) - SeYES
un dominio di terze parti richiede la segretezza avanzata. - NSThirdPartyExceptionAllowsInsecureHTTPLoads (
Boolean
) - SeYES
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:
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:
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.