簡體   English   中英

無法從控制台應用程序向Web API發送/接收客戶端證書

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM