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:
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
eWebClient
.
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:
- Selezionare l'implementazione HttpClient e la libreria TLS predefinita in Opzioni progetto.
- A livello di codice tramite
Xamarin.Android.Net.AndroidClientHandler
. - 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 predefinitaHttpMessageHandler
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, ovverobtls
,legacy
odefault
(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.