HttpClient e selettore dell'implementazione di SSL/TLS per iOS o macOS

Il selettore di implementazione HttpClient per Xamarin.iOS, Xamarin.tvOS e Xamarin.Mac controlla l'implementazione HttpClient da usare. È possibile passare a un'implementazione che usa trasporti nativi iOS, tvOS o macOS (NSUrlSession o CFNetwork, a seconda del sistema operativo). Lo svantaggio è il supporto tls 1.2, file binari più piccoli e download più veloci; lo svantaggio è che richiede che il ciclo di eventi sia in esecuzione per l'esecuzione di operazioni asincrone.

I progetti devono fare riferimento all'assembly System.Net.Http .

Avviso

Aprile 2018 : a causa di requisiti di sicurezza maggiori, tra cui conformità PCI, principali provider di servizi cloud e server Web devono interrompere il supporto delle versioni TLS precedenti alla 1.2. Per impostazione predefinita, i progetti Xamarin creati nelle versioni precedenti di Visual Studio usano versioni precedenti di TLS.

Per garantire che le app continuino a funzionare con questi server e servizi, è necessario aggiornare i progetti Xamarin con l'impostazione NSUrlSession illustrata di seguito, quindi ricompiolere e distribuire nuovamente le app agli utenti.

Selezione di uno stack HttpClient

Per modificare l'oggetto HttpClient usato dall'app:

  1. Fare doppio clic sul nome del progetto nella Esplora soluzioni per aprire le opzioni del progetto.
  2. Passare alle impostazioni di compilazione per il progetto, ad esempio build iOS per un'app Xamarin.iOS.
  3. Nell'elenco a discesa Implementazione HttpClient selezionare il HttpClient tipo come uno dei seguenti: NSUrlSession (scelta consigliata), CFNetwork o Gestito.

Choose HttpClient implementation from Managed, CFNetwork, or NSUrlSession

Suggerimento

Per il supporto di TLS 1.2, è consigliabile usare l'opzione NSUrlSession .

NSUrlSession

Il NSURLSessiongestore basato su è basato sul framework nativo NSURLSession disponibile in iOS 7 e versioni successive. Questa è l'impostazione consigliata.

Vantaggi

  • Usa API native per prestazioni migliori e dimensioni eseguibili inferiori.
  • Supporto per gli standard più recenti, ad esempio TLS 1.2.

Svantaggi

  • Richiede iOS 7 o versione successiva.
  • Alcune HttpClient funzionalità/opzioni non sono disponibili.

CFNetwork

Il CFNetworkgestore basato su si basa sul framework nativo CFNetwork disponibile in iOS 6 e versioni successive.

Vantaggi

  • Usa API native per prestazioni migliori e dimensioni eseguibili inferiori.
  • Supporto per standard più recenti, ad esempio TLS 1.2.

Svantaggi

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

Gestito

Il gestore gestito è il gestore HttpClient completamente gestito fornito con la versione precedente di Xamarin.

Vantaggi

  • Include il set di funzionalità più compatibile con Microsoft .NET e le versioni precedenti di Xamarin.

Svantaggi

  • Non è completamente integrato con i sistemi operativi Apple ed è limitato a TLS 1.0. Potrebbe non essere possibile connettersi a server Web sicuri o servizi cloud in futuro.
  • In genere è molto più lento a livello di crittografia rispetto alle API native.
  • Richiede più codice gestito, creando così un'app più grande distribuibile.

Impostazione a livello di codice di HttpMessageHandler

Oltre alla configurazione a livello di progetto illustrata in precedenza, è anche possibile creare un'istanza HttpClient di e inserire l'oggetto desiderato HttpMessageHandler tramite il costruttore, come illustrato in questi frammenti di codice:

// This will use the default message handler for the application; as
// set in the Project Options for the project.
HttpClient client = new HttpClient();

// This will create an HttpClient that explicitly uses the CFNetworkHandler
HttpClient client = new HttpClient(new CFNetworkHandler());

// This will create an HttpClient that explicitly uses NSUrlSessionHandler
HttpClient client = new HttpClient(new NSUrlSessionHandler());

In questo modo è possibile usare un valore diverso HttpMessageHandler da quello dichiarato nella finestra di dialogo Opzioni progetto.

Implementazione SSL/TLS

SSL (Secure Socket Layer) e il suo successore TLS (Transport Layer Security), forniscono il supporto per HTTP e altre connessioni di rete tramite System.Net.Security.SslStream. L'implementazione di Xamarin.iOS, Xamarin.tvOS o Xamarin.Mac chiamerà l'implementazione SSL/TLS nativa di System.Net.Security.SslStream Apple anziché l'implementazione gestita fornita da Mono. L'implementazione nativa di Apple supporta TLS 1.2.

Avviso

La prossima versione di Xamarin.Mac 4.8 supporterà solo macOS 10.9 o versione successiva. Le versioni precedenti di Xamarin.Mac supportavano macOS 10.7 o versione successiva, ma queste versioni precedenti di macOS non dispongono di un'infrastruttura TLS sufficiente per il supporto di TLS 1.2. Per scegliere come destinazione macOS 10.7 o macOS 10.8, usare Xamarin.Mac 4.6 o versioni precedenti.

ATS (App Transport Security)

App Transport Security (ATS) di Apple applica connessioni sicure tra le risorse Internet (ad esempio il server back-end dell'app) e l'app. ATS garantisce che tutte le comunicazioni Internet 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 utilizza.

Poiché ATS è abilitato per impostazione predefinita nelle app create per iOS 9, tvOS 9 e OS X 10.11 (El Capitan) e versioni successive, 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.

In base alle selezioni di implementazione di HTTPClient Stack e SSL/TLS, potrebbe essere necessario apportare modifiche all'app per funzionare correttamente con ATS.

Per altre informazioni su ATS, vedere la guida alla sicurezza del trasporto delle app.

Problemi noti

Questa sezione illustra i problemi noti relativi al supporto TLS in Xamarin.iOS.

Impossibile caricare il progetto con l'errore "Valore richiesto AppleTLS non trovato"

Xamarin.iOS 9.8 ha introdotto alcune nuove impostazioni contenenti il file con estensione csproj per un'applicazione Xamarin.iOS. Queste modifiche possono causare problemi quando il progetto viene aperto con le versioni precedenti di Xamarin.iOS. Lo screenshot seguente è un esempio del messaggio di errore che può essere visualizzato in questo scenario:

Screenshot of error while trying to load project, requested value legacy not found

Questo errore è causato dall'introduzione dell'impostazione MtouchTlsProvider al file di progetto in Xamarin.iOS 9.8. Se non è possibile eseguire l'aggiornamento a Xamarin.iOS 9.8 (o versione successiva), la soluzione alternativa consiste nel modificare manualmente l'applicazione file con estensione csproj , rimuovere l'elemento MtouchTlsprovider e quindi salvare il file di progetto modificato.

Il frammento di codice seguente è un esempio dell'aspetto dell'impostazione MtouchTlsProvider all'interno di un file con estensione csproj :

<MtouchTlsProvider>Default</MtouchTlsProvider>