我创建了一个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;
。
我在这里做什么错了?
谢谢。
答案 0 :(得分:0)
我自己在研究其中的一些东西并看到了您的问题,我想知道您是否遇到了Securing ASP.NET WebAPI using Client Certificates链接中描述的问题之一
特别是:
4将MyPersonalCA.cer添加到本地计算机->无效的根证书颁发机构。这是关键,尤其是在您正在开发并且想尝试的时候。如果您不这样做,则不会填充Request.ClientCertificate,因为证书链不受信任。