Как захватить сертификат клиента из запроса RESTFul и проверить его на сертификат на сервере в с #?

Я исследовал эту тему последние 2 недели и нашел так много информации, что поражен. Я собираюсь начать с нуля. Я новичок в этом, как никогда раньше ничего не делал с сертификатами. Я создал веб-API RESTful, который перехватывает запросы от почтальона. В запросе я отправляю CERT (my-cert.cer). Я хотел бы использовать контроллер API для захвата CERT из запроса и проверки того, что находится на сервере. Можно ли вообще захватывать CERT так, как я это делаю? Я нигде не нашел хорошего рабочего примера. Пожалуйста помоги!

Вот мой метод GET

public class clientController : ApiController
{
    public string Get(int id)
    {
        X509Certificate2 cert = Request.GetClientCertificate();
        X509Certificate2 cert2 = RequestContext.ClientCertificate;

        logger.addLine(LogLineType.Message, "CERT " + cert + "\n", "page", null);
        logger.addLine(LogLineType.Message, "CERT 2" + cert2 + "\n", "page", null);
        System.Console.WriteLine("cert : " + cert);
        System.Console.WriteLine("cert2 : " + cert2);

        GetClient getClient = new GetClient();
        string response = getClient.RetrieveClientRequest(id).ToString();
        return response; } }

person Dheeraj Dixit    schedule 19.02.2019    source источник
comment
Этот вопрос должен быть более конкретным, чтобы на него можно было ответить. Что вы ожидали, и что произошло вместо этого?   -  person Tom W    schedule 19.02.2019
comment
Кроме того, что означает проверка сертификата на сервере? Вы имеете в виду проверку того, что, например, отпечаток сертификата клиента соответствует сертификату в собственном хранилище сертификатов сервера?   -  person Tom W    schedule 19.02.2019
comment
Еще раз, я новичок. Я передаю сертификат от почтальона в рамках запроса https. Я ожидал увидеть инициализацию сертификата для переменных cert или cert2, которые я объявил выше. Я отвечу «да» на сопоставление отпечатка пальца, если именно так вы сопоставите сертификат из собственного хранилища сертификатов сервера.   -  person Dheeraj Dixit    schedule 19.02.2019
comment
Скорее всего, с вашим кодом все в порядке, и это некорректная конфигурация.   -  person Dave M    schedule 20.02.2019
comment
Я пробовал это и, что удивительно, тоже не могу заставить его работать. Эта проблема предполагает, что PostMan на самом деле довольно строго подходит к сопоставлению шаблонов сертификат клиента на запрошенный URL, поэтому проблема может заключаться в том, что PostMan игнорирует ваш сертификат клиента. Вы уверены, что его используют?   -  person Tom W    schedule 20.02.2019


Ответы (1)


Согласно MSDN

var cert = Request.GetClientCertificate();

доставит вам сертификат, отправленный с запросом.
Для проверки у вас есть два варианта.

1) проверка с помощью OCSP
2) вызов

cert.Verify(); 

чтобы проверить его цепочку локально, используя сертификаты в хранилище сертификатов. Это означает, что он ищет сертификат в локальном хранилище сертификатов или некоторых других сертификатах, которые использовались для построения цепочки доверия для сертификата.

Вся тема очень обширна. Если ваш сертификат был подписан каким-то авторитетом, значит, существует цепочка. a знаки b, b знаки c и c подписывают ваш сертификат (d). Обычно у вас есть центр сертификации (ЦС), который подписывает запросы на сертификаты для пользователей / машин. Этот сертификат CA (в верхнем регистре обычно будет a или b) развертывается на всех машинах, которые находятся в одной компании.

С помощью Verify () вы ищите сам сертификат, знает ли его машина. Если нет, вы поднимаетесь по цепочке, и как только у вас есть тот, который использовался для подписи, вы доверяете всему дереву.

d был подписан c => d неизвестно, но есть подпись c. c тоже неизвестно, но подпись говорит нам, что он был подписан b. b затем устанавливается в доверенных сертификатах вашего компьютера и, следовательно, известен. Итак, вы доверяете b, что позволяет вам доверять c и, следовательно, доверять d.

Конечно, это ничего не говорит об отзыве. Я не уверен, проверит ли .Verify () список отзыва. Лучше использовать OCSP, если он у вас есть.

person Andreas    schedule 19.02.2019
comment
Спасибо, Андреас. Знаете ли вы какие-нибудь примеры, которые я мог бы использовать, чтобы лучше понять это? Объяснение MSDN очень расплывчатое - person Dheeraj Dixit; 19.02.2019
comment
Я отредактировал свой ответ. Это немного кратко, но должно немного помочь вам в понимании. Если вы понимаете немецкий, то об этом есть отличный подкаст, если он называется «Запрос комментариев», где парень по имени Клеменс Шримпе объясняет это более подробно в течение нескольких часов. - person Andreas; 19.02.2019
comment
Спасибо за ваш ответ. Я не говорю по-немецки, и ваш ответ просто не выдержал меня. Повторюсь, я новичок в сертификатах. CERT довольно сложны. - person Dheeraj Dixit; 20.02.2019
comment
Да, они! И если вы только начнете вникать в эту тему, потреблять будет действительно много. Но как только вы понимаете основы, он начинает щелкать. Это не значит, что становится легче, но вы начинаете понимать, что происходит и почему что-то происходит, как это происходит. - person Andreas; 21.02.2019
comment
Я понял это и отвечу здесь - ›https://stackoverflow.com/questions/54948695/no-certificate-in-onauthorizationhttpactioncontext-actioncontext - person Dheeraj Dixit; 04.06.2019