有关应用程序传输层安全性的Xamarin官方文档(iOS,Android)指出,托管的 HttpClient实现仅支持TLS 1.0。强烈建议将Xamarin Apps更新为本机HttpClient实现以支持TLS 1.2。 Visual Studio也指出了这一点:
但是,文档矛盾。描述托管的 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");
但是,通过以下设置,连接成功:
这使我想到以下问题:
1 Visual Studio 7.5.2(内部版本40),Xamarin.iOS 11.12.0.4,Xamarin.Android 8.3.3.2
答案 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。
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