无法从控制台应用程序向Web API发送/接收客户端证书

时间:2019-02-27 08:56:56

标签: c# .net-core certificate asp.net-core-webapi client-certificates

我创建了一个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;

我在这里做什么错了?

谢谢。

1 个答案:

答案 0 :(得分:0)

我自己在研究其中的一些东西并看到了您的问题,我想知道您是否遇到了Securing ASP.NET WebAPI using Client Certificates链接中描述的问题之一

特别是:

  

4将MyPersonalCA.cer添加到本地计算机->无效的根证书颁发机构。这是关键,尤其是在您正在开发并且想尝试的时候。如果您不这样做,则不会填充Request.ClientCertificate,因为证书链不受信任。