0

我在 VS 2022 中使用 Xamarin,针对 Android 的 .NetStanderd2.1 类库。

我想实现一个带有自定义 SSL 证书验证的 HttpCient。

这是我的代码:

var httpClientHandler = new HttpClientHandler();
httpClientHandler.ServerCertificateCustomValidationCallback +=
    (sender, cert, chain, sslPolicyErrors) =>
    {
        return true;
    };
var httpClient = new HttpClient(httpClientHandler);
httpClient.BaseAddress = new Uri(baseUrl);
httpClient.Timeout = TimeSpan.FromSeconds(10);
HttpResponseMessage response =
    await httpClient.GetAsync("api/status");
response.EnsureSuccessStatusCode();

(为易读性做了一些准备)。

我将 Xamarin HttpClient 切换到托管 在此处输入图像描述

我了解禁用 SSL 证书验证的安全隐患,这是在开发环境中使用自签名证书。

如果可能的话,我想使用 TLS 1.2,但接下来是这个问题。

当前的问题是,自定义 SSL 证书验证(返回 true;)在

httpClientHandler.ServerCertificateCustomValidationCallback +=
    (sender, cert, chain, sslPolicyErrors) =>
    {
        return true;
    };

永远不会被执行。

我究竟做错了什么?

4

1 回答 1

0

这应该是一个已知问题,您可以在这里查看:https ://github.com/xamarin/xamarin-android/issues/4688 。

但是您可以尝试通过将 HTTP 处理程序的实现从 xamarin 更改为 Android 来解决它。

请参考以下代码:

在表单中,创建接口INativeHttpMessageHandlerProvider

public interface INativeHttpMessageHandlerProvider
{
    HttpMessageHandler Get();
}

并创建类HttpClientProvider

public class HttpClientProvider
{

        public HttpClient Get()
        {
            var nativeHttpMessageHandler = DependencyService.Get<INativeHttpMessageHandlerProvider>().Get();
            return new HttpClient(nativeHttpMessageHandler);   
            // nativeHttpMessageHander is injected from Android project
        }
    }

在android中,实现接口INativeHttpMessageHandlerProvider

[assembly: Dependency(typeof(AndroidHttpMessageHandlerProvider))]
namespace SmartConnect.Droid.PlatformSpecific
{
    public class AndroidHttpMessageHandlerProvider : INativeHttpMessageHandlerProvider
    {
        public HttpMessageHandler Get()
        {
            return new AndroidClientHandler();
        }
    }
}

参考:https ://github.com/xamarin/xamarin-android/issues/4688#issuecomment-658833938

于 2021-12-13T06:09:34.683 回答