如何使用 C# 中的自签名证书将 Xamarin android 应用程序连接到 Azure?

How to connect a Xamarin android application to Azure with a self signed certificate in C#?

尊敬的 Whosebug 用户,

我已将 Azure Key Vault 自签名证书链接到我的 Azure Web 应用程序,启用 minimal TLS v1.0 并将客户端证书模式设置为 Required强制 SSL/TLS.

如果我在我的 windows 机器上安装密钥保管库 pfx 证书并导航到我的 url(即:https://mywebapp.azurewebsites.net),我的浏览器会提示我使用我的证书,否则我'我遇到了 403 Frobidden 错误,没关系。

当我在我的 Xamarin android 应用程序中加载此 pfx 时,我总是得到 403 Frobidden error.

这是我的代码:

    using (HttpClientHandler handler = new HttpClientHandler() {
        SslProtocols = System.Security.Authentication.SslProtocols.Tls12,
        AutomaticDecompression = DecompressionMethods.Deflate | DecompressionMethods.GZip,
        ClientCertificateOptions = ClientCertificateOption.Manual
    })
    {
        //Add SSL certificat
        X509Certificate2 _privateCert = GetPrivateAPICertificate(); //get a self-signed pfx stored localy in the android filesystem
        if (_privateCert != null)
        {
            handler.ClientCertificates.Add(_privateCert); 
            handler.CheckCertificateRevocationList = false;
            
            handler.ServerCertificateCustomValidationCallback =
                (httpRequestMessage, cert, cetChain, policyErrors) =>
                {
                    return true; // <- when debugging return 2 Microsoft Azure certificate with subject *.azurewebsites.net but not the one I've added to my WebApp "TLS/SSL settings" blade.
                };
        }
    
        using (HttpClient httpClient = new HttpClient(handler))
        {
            using (var request = new HttpRequestMessage { RequestUri = new Uri(url), Method = method })
            {
                response = await httpClient.SendAsync(request).ConfigureAwait(false);
                responseAsString = await response.Content.ReadAsStringAsync();
                response.EnsureSuccessStatusCode(); // <- Throw exception: "Response status code does not indicate success: 403 (Forbidden)."
            }
        }
    }

我做错了什么?

编辑:添加了 GetPrivateAPICertificate 函数

    private X509Certificate2 GetPrivateAPICertificate()
    {
        var assembly = IntrospectionExtensions.GetTypeInfo(typeof(MyCoreAssembly)).Assembly;
        X509Certificate2 cert = new X509Certificate2();

        using (StreamReader sr = new StreamReader(assembly.GetManifestResourceStream("MyCoreAssembly.mycert.pfx")))
        {
            using (MemoryStream ms = new MemoryStream())
            {
                sr.BaseStream.CopyTo(ms);
                cert = new X509Certificate2(ms.ToArray());
            }
        }
        return cert;
    }

更新

我用 postman 做了一些测试,如果我在 postman 的设置中添加我的 pfx 证书,我就可以访问 Azure API。这不是 Azure 中的证书配置问题。

我不明白为什么我的 HttpRequest 中没有从 Xamarin 发送证书!

更新 2

我还在 ASP.NET 控制台应用程序中放入了完全相同的代码,并且可以正常工作。我想我必须在 Xamarin 中向我的 HTTP 调用添加一些内容...

我终于找到了实现这一目标的方法。 下面的post有重点:

通过使用 HttpWebRequest 而不是 HttpClient,我可以发送带有证书的请求。

这是一个倒退,因为 HttpWebRequest 不如新的 HttpClient 实施直观,但这是迄今为止我找到的唯一解决方案...