Не удалось отправить / получить сертификат клиента из консольного приложения на веб-интерфейс - PullRequest
0 голосов
/ 27 февраля 2019

Я создал веб-интерфейс для приема сертификата клиента.
Я вызываю веб-интерфейс из console app, используя следующий код.

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.Я установил флаг clientCertEnabled на true в resources.azure.com.Web Api поддерживает SSL.

Но сертификат всегда отображается как null в
var certHeader = context.Request.Headers["X-ARR-ClientCert"]; и var certificate = context.Connection.ClientCertificate;.

Что я здесь не так делаю?

Заранее спасибо.

1 Ответ

0 голосов
/ 30 апреля 2019

Повторно изучал некоторые из этих вещей сам и увидел ваш вопрос, мне интересно, если у вас возникла одна из проблем, описанных в ссылке Защита ASP.NET WebAPI с использованием клиентских сертификатов

Специально:

4 Добавьте MyPersonalCA.cer на локальный компьютер -> доверенные корневые центры сертификации.Это очень важно, особенно когда вы развиваетесь и хотите что-то попробовать.Если вы этого не сделаете, Request.ClientCertificate не будет заполнен, поскольку цепочка сертификатов не заслуживает доверия.

...