Ошибка Android Xamarin в (https, ssl, tls) - PullRequest
0 голосов
/ 10 июня 2018

Я пытаюсь создать приложение в приложении Microsoft Visual Studio 2017 для Android Xamarin.

Если я повторяю с http, а не (https), он работает нормально

Моя оценка: КакМогу ли я восстановить вызов https?

Базовый код:

using Android.App;
using Android.Widget;
using Android.OS;
using Android.Support.V7.App;
using System.Net.Http;
using System;
using System.Text;
using System.Net;
using System.IO;

//System.Net.WebException: Error: TrustFailure (The authentication or decryption has failed.)

namespace httprequest
{
    [Activity(Label = "@string/app_name", Theme = "@style/AppTheme", MainLauncher = true)]
    public class MainActivity : AppCompatActivity
    {
        private static readonly HttpClient client = new HttpClient();
        Button btn1;

        protected override void OnCreate(Bundle savedInstanceState)
        {
            base.OnCreate(savedInstanceState);

            // Set our view from the "main" layout resource
            SetContentView(Resource.Layout.activity_main);


            if (Build.Brand.Equals("GENERIC", StringComparison.InvariantCultureIgnoreCase))
            {
                ServicePointManager.ServerCertificateValidationCallback +=
                    (sender, cert, chain, sslPolicyErrors) => true;
            }


            btn1 = FindViewById<Button>(Resource.Id.httpbtn1);

            btn1.Click += delegate
            {
                using (var wb = new WebClient())
                {
                    var request = (HttpWebRequest)WebRequest.Create("https://???");

                    request.KeepAlive = false;
                    request.ProtocolVersion = HttpVersion.Version10;

                    var response = (HttpWebResponse)request.GetResponse();

                    var responseString = new StreamReader(response.GetResponseStream()).ReadToEnd();

                    Console.WriteLine(responseString);
                }
            };
        }
    }
}

Вот что я получаю:

Необработанное исключение: System.Net.WebException: Ошибка: TrustFailure (Произошла одна или несколько ошибок.)

В расширенных свойствах Adnroid:

Реализация HttpClient: Android

Реализация SSL / TLS: собственный TLS1,2 +

1 Ответ

0 голосов
/ 28 сентября 2018

Возможно, он все еще помогает ОП или кому-то еще, спотыкаясь над этим вопросом: я хотел получить доступ к API нашей компании, использующему сертификат, выданный доверенной Сторонней организацией, через Samsung S7 (Android 8), подключенный к нашему серверу Blackberry.На самом устройстве было установлено необходимое свидетельство, но я все еще получал исключение Trust Failure, пока я не переключил HTTPS-реализацию, как OP сказал:

Щелкните правой кнопкой мыши на проекте Android -> Настройки -> Android-Параметры ->Advanced

Измените реализацию HTTPClient на Android, а реализацию SSL / TLS на Native TLS 1.2 +

Тогда я получил следующую ошибку:

java.security.cert.CertPathValidatorException: Trust anchor for certification path not found.

Так что, похоже, вынужно указать Android на собственные хранилища сертификатов.Для этого выполните следующие действия:

Создайте подкаталог xml в своем каталоге ресурсов

Внутри создайте файл network_security_config.xml со следующим содержимым

<?xml version="1.0" encoding="utf-8" ?>
 <network-security-config>
  <base-config>
   <trust-anchors>
    <!-- Trust preinstalled CAs -->
    <certificates src="system" />
    <!-- Additionally trust user added CAs -->
    <certificates src="user" />
  </trust-anchors>
 </base-config>
</network-security-config>

Откройте AndroidManifest.xml и добавьте следующий атрибут в тег приложения

<application [...] android:networkSecurityConfig="@xml/network_security_config">

В моем случае после этого все работало без ошибок.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...