2017-09-25 1 views
0

J'essaye d'envoyer une transaction POST de Xamarin.Forms en utilisant TLS1.2 mais je les vois arriver au serveur en tant que TLS 1.1.Impossible d'envoyer TLS 1.2 avec Xamarin.Forms et VisualStudio 2017

J'ai configuré les options Android:

HttpClient impletemtation comme Android

SSL/TLS mise en œuvre natif TLS 1.2+

Je suis mise en œuvre et l'exécution en VisualStudio 2017, et l'utilisation de Android 6.0 dans l'émulateur.

En ce qui concerne le code, je définirait des variables d'environnement:

System.Environment.SetEnvironmentVariable("MONO_TLS_PROVIDER‌​", "btls"); 
System.Environment.SetEnvironmentVariable("XA_TLS_PROVIDER‌​", "btls"); 
System.Environment.SetEnvironmentVariable("XA_HTTP_CLIENT_HANDLER_TYPE", "Xamarin.Android.Net.AndroidClientHandler"); 
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12; 

Enfin, POST est envoyé avec:

using (HttpClient client = new HttpClient()) 
    or 
    using (HttpClient client = new HttpClient(new NativeMessageHandler())) 
    or 
    using (HttpClient client = new HttpClient(new Xamarin.Android.Net.AndroidClientHandler())) 
    { 
    try 
    { 
    HttpResponseMessage responseHttp = await client.PostAsync(new Uri(new Uri(Constants.ApiBaseUrl), "authorize"), content); 
    ... 

Où Constants.ApiBaseUrl contient une URL avec https: // <> Format .

Le problème est, lorsque le POST est envoyé Je n'ai pas des exceptions, mais dans mon serveur, je vois avec Wireshark la transaction:

enter image description here J'ai aussi essayé d'une autre manière, en utilisant:

HttpWebRequest httpWebRequest = WebRequest.CreateHttp(new Uri(new Uri(Constants.ApiBaseUrl), "authorize")); 
    httpWebRequest.Method = "POST"; 
    httpWebRequest.Credentials = CredentialCache.DefaultNetworkCredentials; 
    Stream sw = httpWebRequest.GetRequestStream(); 
    sw.Write(contentByte, 0, contentByte.Length); 
    HttpWebResponse httpWebResponse = (HttpWebResponse)httpWebRequest.GetResponse(); 

Avec et sans mes propres certificats à l'aide:

httpWebRequest.ClientCertificates = cryptoSvc.x509HostCertificates; 

Dans ce cas, si j'utilise

ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12; 

je reçois l'exception

RestService-SendJsonDataAsync ERROR: Error: SecureChannelFailure 
     (**Ssl error:100000f0:SSL routines:OPENSSL_internal:UNSUPPORTED_PROTOCOL** 
     at /Users/builder/jenkins/workspace/xamarin-android/xamarin-android/external/mono/external/boringssl/ssl/handshake_client.c:808) 

Sans cette ligne, il arrive aussi que TLS1.1.

Est-ce que quelqu'un a une idée ou une suggestion sur ce qui ne va pas dans mon cas, s'il vous plaît?

Merci beaucoup pour votre temps et votre aide.

Répondre

1

Je crois que dans Android 6.0, TLS 1.2 est activé par défaut:

https://developer.android.com/reference/javax/net/ssl/SSLSocket.html

Mais, vous avez la configuration de BTLS et natif TLS 1.2, je pense que ce sont contradictoires. BTLS est l'implémentation Boring TLS, conçue pour fournir le support TLS 1.2 sur les anciennes versions d'Android. Je pense que vous pouvez supprimer ces lignes en toute sécurité.

Je vérifie d'abord ce que le serveur autorise en termes de sécurité et, si possible, que le serveur limite les connexions HTTPS à TLS 1.2 uniquement.

Si vous souhaitez essayer de forcer uniquement TLS 1.2 connexions sur le côté client, jetez un oeil à cette réponse (notez ceci est en Java, mais le processus est le même):

How to set TLS version on apache HttpClient

+0

Merci pour votre commentaire @DanielMaclean, j'ai essayé sans ces lignes, mais avec le même résultat. D'un autre côté, mon serveur permet les deux connexions pour le moment. – santiPipes

+0

Pouvez-vous essayer de désactiver 1.1 sur le serveur? – LewisT

+0

Je ne peux pas, le serveur doit autoriser les deux connexions. Je me connecte avec des terminaux de paiement à ce serveur en utilisant TLS1.1 et TLS1.2 sans problèmes. – santiPipes