托管Xamarin HttpClient实现是否支持TLS 1.2?

时间:2018-06-20 14:44:49

标签: xamarin xamarin.ios xamarin.android tls1.2

有关应用程序传输层安全性的Xamarin官方文档(iOSAndroid)指出,托管的 HttpClient实现仅支持TLS 1.0。强烈建议将Xamarin Apps更新为本机HttpClient实现以支持TLS 1.2。 Visual Studio也指出了这一点:

enter image description here

但是,文档矛盾。描述托管的 HttpClient实现时,其内容如下:

  

它没有与操作系统完全集成(例如,限于TLS 1.0)。

此文档后来有矛盾的陈述,例如:

  

从Xamarin.Android 8.3开始,HttpClientHandler默认为无聊的SSL ...它支持TLS 1.2 +。

此外,此very helpful Xamarin blog post指出,通过选择 SSL / TLS选项“本机TLS 1.2” (这是iOS和Windows Server 2003的默认设置),托管HttpClient实现确实可以实现TLS 1.2。无法在iOS上更改)。

最后但并非最不重要的一点是,我针对仅支持TLS 1.2的https://www.nist.gov测试了当前稳定Xamarin版本 1 的HttpClient。我确认服务器仅接受TLS 1.2,并且:

openssl s_client -connect nist.gov:443 -no_tls1_2

如果托管的HttpClient实现确实仅支持TLS 1.0,则我期望以下连接失败:

var client = new HttpClient();
var result = await client.GetStringAsync("https://www.nist.gov");

但是,通过以下设置,连接成功:

  • iOS:HttpClient实现托管
  • Android:HttpClient实现托管(HttpClientHandler)默认,以及SSL / TLS实现本地TLS 1.2

这使我想到以下问题:

  1. 在声明托管HttpClient实现仅支持TLS 1.0时,Xamarin文档是否过时了?
  2. 我对https://www.nist.gov的测试是否有效?是否确实表明托管的HttpClient实现支持TLS 1.2?还是我想念什么?

1 Visual Studio 7.5.2(内部版本40),Xamarin.iOS 11.12.0.4,Xamarin.Android 8.3.3.2

1 个答案:

答案 0 :(得分:2)

如果您使用“本机”处理程序(Android或iOS),则它使用本机API来实现HttpClientHandler功能,因此取决于是否支持TLS1.2,即“平台依赖”,即Android 5 / API-21本身不支持TLS1.2,大多数Android开发人员都使用第三方库...

启用“本机SSL / TLS”后,是否使用Google的BoringSSL(现已包含在您的应用程序捆绑包中)和本机平台API。因此,即使使用“托管” HttpClientHandler,也支持TLS1.2。此选项允许“ .Net framework / Mono”支持iOS和Android上的最新SSL / TLS,例如.Net套接字,WebClient等。当然还有HttpClient。

https://www.nist.gov测试:

Android Handler / Managed SSL    :  No exception
Managed Handler / Native SSL/TLS :  No exception
Android Handler / Native SSL/TLS :  No exception
Managed Handler / Managed SSL    :  Error: SecureChannelFailure 

SecureChannelFailure

MonoDroid] UNHANDLED EXCEPTION:
[MonoDroid] System.Net.Http.HttpRequestException: An error occurred while sending the request ---> System.Net.WebException: Error: SecureChannelFailure (The authentication or decryption has failed.) --->
System.IO.IOException: The authentication or decryption has failed. --->
System.IO.IOException: Error while sending TLS Alert (Fatal:InternalError): System.IO.IOException: The authentication or decryption has failed. --->
System.IO.IOException: Unable to read data from the transport connection: Connection reset by peer. ---> 
System.Net.Sockets.SocketException: Connection reset by peer