Selettore di implementazione HTTPClient e SSL/TLS per Android

I selettori di implementazione HttpClient Stack e SSL/TLS determinano l'implementazione HttpClient e SSL/TLS che verrà usata dalle app Xamarin.Android.

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 le Android HttpClient impostazioni e Native TLS 1.2 illustrate di seguito, quindi ricompiolere e distribuire nuovamente le app agli utenti.

La configurazione HttpClient di Xamarin.Android si trova in Opzioni > di Project Android, quindi fare clic sul pulsante Opzioni avanzate.

Queste sono le impostazioni consigliate per il supporto di TLS 1.2:

Visual Studio Android Options

Opzioni di configurazione alternative

AndroidClientHandler

AndroidClientHandler è il nuovo gestore che delega al codice Java/OS nativo anziché implementare tutti gli elementi nel codice gestito. Questa è l'opzione consigliata.

Vantaggi

  • Usare l'API nativa per ottenere prestazioni migliori e dimensioni eseguibili inferiori.
  • Supporto per gli standard più recenti, ad esempio. TLS 1.2.

Svantaggi

  • Richiede Android 4.1 o versione successiva.
  • Alcune funzionalità/opzioni httpClient non sono disponibili.

Gestito (HttpClientHandler)

Il gestore gestito è il gestore HttpClient completamente gestito fornito con le versioni precedenti di Xamarin.Android.

Vantaggi

  • È la versione più compatibile (funzionalità) con MS .NET e le versioni precedenti di Xamarin.

Svantaggi

  • Non è completamente integrato con il sistema operativo (ad esempio, limitato a TLS 1.0).
  • In genere è molto più lento (ad esempio, la crittografia) rispetto all'API nativa.
  • Richiede più codice gestito, creando applicazioni di dimensioni maggiori.

Scelta di un gestore

La scelta tra AndroidClientHandler e HttpClientHandler dipende dalle esigenze dell'applicazione. AndroidClientHandler è consigliato per il supporto di sicurezza più aggiornato, ad esempio.

  • È necessario il supporto TLS 1.2+.
  • L'app è destinata ad Android 4.1 (API 16) o versione successiva.
  • È necessario il supporto tls 1.2+ per HttpClient.
  • Non è necessario il supporto TLS 1.2+ per WebClient.

HttpClientHandler è una buona scelta se è necessario il supporto TLS 1.2+ ma deve supportare versioni di Android precedenti ad Android 4.1. È anche una buona scelta se è necessario il supporto TLS 1.2+ per WebClient.

A partire da Xamarin.Android 8.3, HttpClientHandler l'impostazione predefinita è Boring SSL (btls) come provider TLS sottostante. Il provider TLS SSL Boring offre i vantaggi seguenti:

  • Supporta TLS 1.2+.
  • Supporta tutte le versioni di Android.
  • Fornisce il supporto TLS 1.2+ per entrambi HttpClient e WebClient.

Lo svantaggio dell'uso di Boring SSL come provider TLS sottostante è che può aumentare le dimensioni dell'APK risultante (aggiunge circa 1 MB di dimensioni APK aggiuntive per ABI supportato).

A partire da Xamarin.Android 8.3, il provider TLS predefinito è Boring SSL (btls). Se non si vuole usare Boring SSL, è possibile ripristinare l'implementazione SSL gestita cronologica impostando la $(AndroidTlsProvider) proprietà su legacy . Per altre informazioni sull'impostazione delle proprietà di compilazione, vedere Processo di compilazione.

Uso a livello di codice AndroidClientHandler

Xamarin.Android.Net.AndroidClientHandler è un'implementazione HttpMessageHandler specifica per Xamarin.Android. Le istanze di questa classe useranno l'implementazione nativa java.net.URLConnection per tutte le connessioni HTTP. Ciò offrirà teoricamente un aumento delle prestazioni HTTP e delle dimensioni apk più piccole.

Questo frammento di codice è un esempio di come usare in modo esplicito una singola istanza della HttpClient classe :

// Android 4.1 or higher, Xamarin.Android 6.1 or higher
HttpClient client = new HttpClient(new Xamarin.Android.Net.AndroidClientHandler ());

Nota

Il dispositivo Android sottostante deve supportare TLS 1.2 (ad esempio. Android 4.1 e versioni successive). Si noti che il supporto ufficiale per TLS 1.2 è in Android 5.0+. Tuttavia, alcuni dispositivi supportano TLS 1.2 in Android 4.1+.

Opzione di compilazione dell'implementazione SSL/TLS

Questa opzione di progetto controlla quale libreria TLS sottostante verrà usata da tutte le richieste Web, sia HttpClient che WebRequest. Per impostazione predefinita, è selezionato TLS 1.2:

Ad esempio:

var client = new HttpClient();

Se l'implementazione httpClient è stata impostata su Gestito e l'implementazione di TLS TLS è stata impostata su Native TLS 1.2+, l'oggetto client userà automaticamente l'oggetto gestito HttpClientHandler e TLS 1.2 (fornito dalla libreria BoringSSL) per le richieste HTTP.

Tuttavia, se l'implementazione httpClient è impostata su AndroidHttpClient, tutti gli HttpClient oggetti useranno la classe java.net.URLConnection Java sottostante e non saranno interessati dal valore di implementazione TLS/SSL. WebRequest gli oggetti userebbero la libreria BoringSSL.

Altri modi per controllare la configurazione SSL/TLS

Esistono tre modi in cui un'applicazione Xamarin.Android può controllare le impostazioni TLS:

  1. Selezionare l'implementazione HttpClient e la libreria TLS predefinita in Opzioni progetto.
  2. A livello di codice tramite Xamarin.Android.Net.AndroidClientHandler.
  3. Dichiarare le variabili di ambiente (facoltativo).

Tra le tre opzioni consigliate, l'approccio consigliato consiste nell'usare le opzioni del progetto Xamarin.Android per dichiarare il valore predefinito HttpMessageHandler e TLS per l'intera app. Quindi, se necessario, creare Xamarin.Android.Net.AndroidClientHandler un'istanza di oggetti a livello di codice. Queste opzioni sono descritte in precedenza.

La terza opzione, che usa le variabili di ambiente, è illustrata di seguito.

Dichiarare le variabili di ambiente

Esistono due variabili di ambiente correlate all'uso di TLS in Xamarin.Android:

  • XA_HTTP_CLIENT_HANDLER_TYPE : questa variabile di ambiente dichiara l'impostazione predefinita HttpMessageHandler che verrà usata dall'applicazione. Ad esempio:

    XA_HTTP_CLIENT_HANDLER_TYPE=Xamarin.Android.Net.AndroidClientHandler
    
  • XA_TLS_PROVIDER : questa variabile di ambiente dichiarerà quale libreria TLS verrà usata, ovvero btls, legacyo default (che equivale a omettere questa variabile):

    XA_TLS_PROVIDER=btls
    

Questa variabile di ambiente viene impostata aggiungendo un file di ambiente al progetto. Un file di ambiente è un file di testo normale in formato Unix con un'azione di compilazione androidEnvironment:

Per altre informazioni sulle variabili di ambiente e Xamarin.Android, vedere la guida all'ambiente Xamarin.Android.