Подтвердить что ты не робот

Игнорировать ошибки сертификата SSL в Xamarin.Forms(PCL)

Есть ли способ сделать что-то вроде описанного здесь: qaru.site/info/37300/..., но в приложении Xamarin.Forms PCL? Я использую HttpClient для подключения к серверу.

4b9b3361

Ответ 1

ServicePointManager не определен в PCL, но определен в классах, специфичных для платформы.

Есть ServicePointManager в Xamarin.iOS и Xamarin.Android с одинаковым использованием. Вы можете ссылаться на него внутри любых классов в ваших проектах платформы. Однако в настоящее время такого класса нет и, похоже, не подходит для приложения Windows Phone.

Пример:

// Xamarin.Android

public class MainActivity : global::Xamarin.Forms.Platform.Android.FormsApplicationActivity
{
    protected override void OnCreate(Bundle bundle)
    {
        // You may use ServicePointManager here
        ServicePointManager
            .ServerCertificateValidationCallback +=
            (sender, cert, chain, sslPolicyErrors) => true;

        base.OnCreate(bundle);

        global::Xamarin.Forms.Forms.Init(this, bundle);
        LoadApplication(new App());
    }
}

// Xamarin.iOS

public partial class AppDelegate : global::Xamarin.Forms.Platform.iOS.FormsApplicationDelegate
{
    public override bool FinishedLaunching(UIApplication app, NSDictionary options)
    {
        ServicePointManager
            .ServerCertificateValidationCallback +=
            (sender, cert, chain, sslPolicyErrors) => true;

        global::Xamarin.Forms.Forms.Init();
        LoadApplication(new App());

        return base.FinishedLaunching(app, options);
    }
}

Ответ 2

Если вы используете AndroidClientHandler, вам необходимо предоставить SSLSocketFactory и пользовательскую реализацию HostnameVerifier с отключенными всеми проверками. Для этого вам нужно AndroidClientHandler подкласс AndroidClientHandler и переопределить соответствующие методы.

internal class BypassHostnameVerifier : Java.Lang.Object, IHostnameVerifier
{
    public bool Verify(string hostname, ISSLSession session)
    {
        return true;
    }
}

internal class BypassSslValidationClientHandler : AndroidClientHandler
{
    protected override SSLSocketFactory ConfigureCustomSSLSocketFactory(HttpsURLConnection connection)
    {
        return SSLCertificateSocketFactory.GetInsecure(1000, null);
    }

    protected override IHostnameVerifier GetSSLHostnameVerifier(HttpsURLConnection connection)
    {
        return new BypassHostnameVerifier();
    }
}

А потом

var handler = new BypassSslValidationClientHandler();
var httpClient = new System.Net.Http.HttpClient(handler);

Ответ 3

Я столкнулся с этим, но с немного другим сообщением об ошибке:

Ssl error:1000007d:SSL routines:OPENSSL_internal:CERTIFICATE_VERIFY_FAILED
  at /Users/builder/jenkins/workspace/archive-mono/2019-02/android/release/external/boringssl/ssl/handshake_client.c:1132

Я исправил это с помощью OnCreate (MainActivity.cs):

protected override void OnCreate(Bundle savedInstanceState)
{
    TabLayoutResource = Resource.Layout.Tabbar;
    ToolbarResource = Resource.Layout.Toolbar;

    base.OnCreate(savedInstanceState);

// HERE
#if DEBUG
System.Net.ServicePointManager.ServerCertificateValidationCallback = delegate { return true; };
#endif

    Xamarin.Essentials.Platform.Init(this, savedInstanceState);
    Forms.Init(this, savedInstanceState);

    // Initialize Material Design renderer
    FormsMaterial.Init(this, savedInstanceState);


    LoadApplication(new App());
}

Это было исправлением для Android, размещение того же кода в FinishedLaunching (AppDelegate.cs) для iOS также должно работать.