如何使用 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
实施直观,但这是迄今为止我找到的唯一解决方案...
尊敬的 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
实施直观,但这是迄今为止我找到的唯一解决方案...