Xamarin格式:System.Net.Http.HttpClient通过https和ServerCertificateValidationCallback连接未命中

问题描述 投票:0回答:1

在Xamarin Forms应用程序中,我正在使用System.Net.Http.HttpClient通过https建立与服务器的连接。 Visual Studio版本16.5.4,Xamarin Forms版本4.5.0.617,Android:目标框架:Android 9.0(Pie),iOS:SDK版本13.4。我只想接受来自CA的一个证书。在开始之后,在第一个请求之前,我通过以下方式验证服务器证书:

private const string SupportedPublicKey = "118SDD782...HA4JD";

        public static void SetUp()
        {
            ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
            ServicePointManager.ServerCertificateValidationCallback += ValidateServerCertficate;
        }

        private static bool ValidateServerCertficate(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors)
        {
            var certKey = certificate?.GetPublicKeyString();
            return SupportedPublicKey == certificate?.GetPublicKeyString();
        }

程序在SetUp方法中达到断点,但是内部事件的断点从未达到。我已经在其中放置了Console.WriteLine()那里的方法来检查调试器是否损坏,但是控制台是清晰的,因此程序永远无法到达该代码。

目前在两个平台上的仿真器和真实设备上的应用程序的行为都像接受所有证书一样,无论它们来自何处并通过https连接到其他服务器。

我曾尝试将android:HttpClient实现的项目属性从“默认”更改为“托管”和“ android”,在iOS上:从“托管(默认)”更改为“ NSUrlSession(iOS 7+)”和“ CFNetwork( iOS 6以上版本)”,但没有任何效果。我该如何解决?

xamarin xamarin.forms
1个回答
1
投票

尝试更改您的代码以使用.NET Core中的新HttpClientHandler.ServerCertificateCustomValidationCallback API。

public static void SetUp()
    {
        HttpClientHandler httpClientHandler = new HttpClientHandler();
        httpClientHandler.ServerCertificateCustomValidationCallback = ValidateServerCertficate;
    }

private static bool ValidateServerCertficate(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors)
    {
        var certKey = certificate?.GetPublicKeyString();
        return SupportedPublicKey == certificate?.GetPublicKeyString();
    }

您可以在github上引用this

© www.soinside.com 2019 - 2024. All rights reserved.