【问题标题】:Cannot send TLS 1.2 with Xamarin.Forms and VisualStudio 2017无法使用 Xamarin.Forms 和 VisualStudio 2017 发送 TLS 1.2
【发布时间】:2017-09-25 09:24:40
【问题描述】:

我正在尝试使用 TLS1.2 从 Xamarin.Forms 发送 POST 事务,但我看到它们以 TLS 1.1 的形式到达服务器。

我已配置 Android 选项:

HttpClient 实现为 Android

SSL/TLS 实现为 Native TLS 1.2+

我在 VisualStudio 2017 中实现和执行,并在模拟器中使用 Android 6.0。

关于代码,我设置了一些环境变量:

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;

最后,POST 发送:

   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);
    ...

Constants.ApiBaseUrl 包含 https:// 格式的 url。

问题是,发送 POST 时我没有异常,但在我的服务器中,我使用 Wireshark 看到的事务为:

我也尝试过其他方式,使用:

  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();

使用和不使用我自己的证书:

  httpWebRequest.ClientCertificates = cryptoSvc.x509HostCertificates;

在这种情况下,如果我使用

  ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;

我得到了异常

   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)

如果没有该行,它也将作为 TLS1.1 到达。

请问有人对我的问题有什么想法或建议吗?

非常感谢您的时间和帮助。

【问题讨论】:

    标签: android xamarin.forms tls1.2


    【解决方案1】:

    我相信Android 6.0,默认启用TLS 1.2:

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

    但是,你有 BTLS 配置和 Native TLS 1.2,我认为它们是冲突的。 BTLS 是 Boring TLS 实现,旨在为旧版本的 Android 提供 TLS 1.2 支持。我认为您可以安全地删除这些行。

    我首先确认服务器在安全方面允许什么,如果可能的话,让服务器将 HTTPS 连接限制为仅 TLS 1.2。

    如果您想尝试仅在客户端强制使用 TLS 1.2 连接,请查看此答案(注意这是在 Java 中,但过程相同):

    How to set TLS version on apache HttpClient

    【讨论】:

    • 感谢您的评论@DanielMaclean,我尝试不使用这些行但结果相同。另一方面,我的服务器目前允许两个连接。
    • 您可以尝试在服务器上禁用 1.1 吗?
    • 我不能,服务器必须允许两个连接。我实际上使用 TLS1.1 和 TLS1.2 将支付终端连接到此服务器,没有任何问题。
    • 我已经更新了我的答案,提供了如何强制 HTTPClient 仅尝试 TLS 1.2 连接的链接
    • 谢谢@DanielMaclean,我正在尝试使其适应C#,我会再写一遍结果
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-05-12
    • 1970-01-01
    • 1970-01-01
    • 2015-05-01
    • 2017-02-10
    • 2023-03-29
    • 2021-12-03
    相关资源
    最近更新 更多