无法从Console App向Web api发送/接收客户端证书

问题描述 投票:0回答:1

我创建了一个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上运行它。我在clientCertEnabled将旗帜true设置为resources.azure.com。 Web Api已启用SSL。

但证书总是以null的形式出现 var certHeader = context.Request.Headers["X-ARR-ClientCert"];var certificate = context.Connection.ClientCertificate;

我在这做错了什么?

提前致谢。

c# .net-core certificate asp.net-core-webapi client-certificates
1个回答
0
投票

我自己正在研究这些东西并看到你的问题,我想知道你是否遇到链接qazxsw poi中描述的问题之一

特别:

4将MyPersonalCA.cer添加到本地计算机 - >已终止的根证书颁发机构。这是关键,特别是在你正在发展并想要尝试的时候。如果不这样做,将不会填充Request.ClientCertificate,因为证书链不受信任。

© www.soinside.com 2019 - 2024. All rights reserved.