xamarin - 托管 Xamarin HttpClient 实现是否支持 TLS 1.2?
问题描述
应用程序传输层安全性(iOS、Android)的官方 Xamarin 文档声明托管的HttpClient 实现仅支持 TLS 1.0。它强烈建议将 Xamarin 应用程序更新为本机 HttpClient 实现以支持 TLS 1.2。Visual Studio 也说明了这一点:
但是,文档是矛盾的。在描述托管HttpClient 实现时,它声明如下:
它没有与操作系统完全集成(例如,仅限于 TLS 1.0)。
后来的文档有相互矛盾的陈述,例如:
从 Xamarin.Android 8.3 开始,HttpClientHandler 默认为 Boring SSL ...它支持 TLS 1.2+。
此外,这篇非常有用的 Xamarin 博客文章指出,通过选择SSL/TLS 选项“本机 TLS 1.2”(这是 iOS 上的默认设置,在 iOS 上无法更改),托管 HttpClient 实现确实可以实现 TLS 1.2。
最后但同样重要的是,我针对仅支持 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 实现Managed (HttpClientHandler)或Default,以及 SSL/TLS 实现Native TLS 1.2。
这导致我提出以下问题:
- 当说明托管 HttpClient 实现仅支持 TLS 1.0 时,Xamarin 文档是否已过时?
- 我对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
解决方案
如果您使用“本机”处理程序(Android 或 iOS),则它使用本机 API 来实现HttpClientHandler
功能,因此“依赖于平台”取决于是否支持 TLS1.2,即 Android 5/API-21 不支持原生支持 TLS1.2,大多数 Android 开发者使用 3rd-party lib...
当您启用“本机 SSL/TLS”时,它是使用 Google 的 BoringSSL(现在包含在您的应用程序包中)而不是本机平台 API。因此,即使使用“托管”HttpClientHandler 也支持 TLS1.2。此选项允许“.Net framework/Mono”支持 iOS 和 Android 上最新的 SSL/TLS,例如 .Net Sockets、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
安全通道故障:
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
推荐阅读
- excel - 保存工作簿的“备份副本”而不提交对 Excel 的更改?
- javascript - Javascript 表单验证 dom 选择器
- matlab - 无法将我的 c++ 应用程序与 MATLAB 连接
- google-app-engine - appcfg.sh 更新突然抛出 401 错误
- reactjs - 使用 onSubmit 为多个输入设置状态?
- postgresql - 如何将空日期插入postgres
- networking - Kubernetes pod wget -qO- 对某些服务失败,但不是全部
- api - 从我的 ESP8266 POST 到 REST API
- javascript - 从一个元素中删除类,同时使用 javascript 将该类添加到另一个元素
- google-apps-script - 在 Google 表格中显示活动单元格