[英]Fail to send/receive Client Certificate from Console App to web api
我創建了一個Web Api以接受客戶端證書。
我正在使用以下代碼從console app
調用Web API。
var uri = new Uri("https://myservice.azurewebsites.net/api/values");
var handler = new WebRequestHandler();
handler.ClientCertificateOptions = ClientCertificateOption.Manual;
var certResults = new X509Store(StoreLocation.LocalMachine);
var certStore = new X509Store(StoreName.My, StoreLocation.CurrentUser);
try
{
certStore.Open(OpenFlags.ReadOnly);
}
catch (Exception)
{
Console.WriteLine("Unable to access Certificate store");
}
var thumbprint = "<<self signed cert thumbprint>>";
var certCollection = certStore.Certificates.Find(X509FindType.FindByThumbprint, thumbprint, false);
certStore.Close();
HttpClient client = new HttpClient(handler);
if (certCollection.Count > 0)
{
handler.ClientCertificates.Add(certCollection[0]);
client.DefaultRequestHeaders.Add("Thumbprint", certCollection[0].Thumbprint);
}
var result = client.GetAsync(uri).GetAwaiter().GetResult();
Console.WriteLine($"status: {result.StatusCode}");
Console.WriteLine($"content: {result.Content.ReadAsStringAsync().GetAwaiter().GetResult()}");
Console.ReadLine();
}
在服務器端,我添加了一個中間件來獲取證書詳細信息。
{
//var certHeader = context.Request.Headers["X-ARR-ClientCert"];
var certificate = context.Connection.ClientCertificate;
if (certificate != null)
{
try
{
//var clientCertBytes = Convert.FromBase64String(certHeader);
//var certificate = new X509Certificate2(clientCertBytes);
bool isValidCert = IsValidClientCertificate(certificate);
if (isValidCert)
{
await _next.Invoke(context);
}
else
{
_logger.LogError("Certificate is not valid");
context.Response.StatusCode = 403;
}
}
catch (Exception ex)
{
_logger.LogError(ex.Message, ex);
await context.Response.WriteAsync(ex.Message);
context.Response.StatusCode = 403;
}
}
else
{
_logger.LogError("X-ARR-ClientCert header is missing");
context.Response.StatusCode = 403;
}
}
我嘗試在本地計算機和Azure App Services上運行它。 我在resources.azure.com
中將標志clientCertEnabled
設置為true
。 Web Api已啟用SSL。
但是,證書在兩種情況下都始終為null
var certHeader = context.Request.Headers["X-ARR-ClientCert"];
和var certificate = context.Connection.ClientCertificate;
。
我在這里做錯了什么?
提前致謝。
我自己在研究其中的一些內容並看到了您的問題,我想知道您是否遇到了使用客戶端證書保護ASP.NET WebAPI鏈接中描述的問題之一。
特別:
4將MyPersonalCA.cer添加到本地計算機->根證書頒發機構。 這是關鍵,尤其是在您正在開發並且想嘗試的時候。 如果您不這樣做,則不會填充Request.ClientCertificate,因為證書鏈不受信任。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.