Форум программистов, компьютерный форум, киберфорум
C#: Web, ASP.NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
5 / 4 / 2
Регистрация: 12.07.2023
Сообщений: 69

Колекция сертификатов из httpcontext

07.01.2024, 22:39. Показов 1331. Ответов 6
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем привет! Столкнулся с проблемой получения коллекции сертификатов из httpcontext.
Можно получить сертификат через Connection, но мне нужна именно коллекция (Отправляется несколько сертификатов).
C#
1
2
var httpContext = context.GetHttpContext();
clientCertificate = httpContext.Connection.ClientCertificate;
В интернете пока ничего подходящего не нашел.
Судя по всему нужно получить что то вроде HttpClientHandler и уже оттуда достать коллекцию.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
07.01.2024, 22:39
Ответы с готовыми решениями:

Обобщенная колекция в DbContext
Подскажите как вместо DbContext.Temp.Add(item); использовать обобщенную коллекцию DbContext.<T>.Add(item);

Запрос сертификатов по списку номеров сертификатов: что делает приведенная строка кода
Добрый день, извиняюсь за свою глупость: Имеется метод с помощью которого я реализую: Запрос сертификатов по списку номеров сертификатов ...

Колекция програм
Насобирал немного програм по Паскалю и решил разместить здесь!!! В архиве собраны програмы по: Графика, Массивы и матрици, Математика,...

6
HF
 Аватар для HF
1303 / 882 / 199
Регистрация: 09.09.2011
Сообщений: 2,590
Записей в блоге: 2
07.01.2024, 23:50
Вы уверены что в контексте может быть коллекция? Не путаете с получением обычной коллекции из контейнера сертификатов?
Ну потому что я не помню ни одного аналогичного поведения ни в одной системе. Везде вы должны указать только Один сертификат. Тем более клиентский. Каким образом вы бы сказали что у вас не один документ, а три?
0
5 / 4 / 2
Регистрация: 12.07.2023
Сообщений: 69
08.01.2024, 00:24  [ТС]
Про то что в контексте может быть коллекция не уверен.
Если я правильно вас понял контейнер сертификатов вы имеете ввиду X509CertificateStore? Если да то я просто подгружаю сертификаты из $HOME директории (результат загрузки это структура FullIdentity).
Вот собственно она:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
public struct FullIdentity
    {
        public readonly X509Certificate2[] RestChain;
 
        public readonly X509Certificate2 Cert;
 
        public readonly byte[] NodeID;
 
        public readonly X509Certificate2 Leaf;
 
        public readonly AsymmetricAlgorithm PrivateKey;
 public FullIdentity(X509Certificate2[] RestChain, X509Certificate2 Cert, byte[] NodeID, X509Certificate2 Leaf, AsymmetricAlgorithm PrivateKey)
        {
            this.RestChain = RestChain;
            this.Cert = Cert;
            this.NodeID = NodeID;
            this.Leaf = Leaf;
            this.PrivateKey = PrivateKey;
        }
 
        public FullIdentity(PeerIdentity peerIdentity, AsymmetricAlgorithm PrivateKey)
        {
            this.RestChain = peerIdentity.RestChain;
            this.Cert = peerIdentity.Cert;
            this.NodeID = peerIdentity.NodeID;
            this.Leaf = peerIdentity.Leaf;
            this.PrivateKey = PrivateKey;
        }
}
Далее я эти сертификаты засовываю коллекцию и цепляю к хендлеру и отправляю. Далее я хочу также всю эту коллекцию выгрузить уже на сервере.

Вот кусок кода:
C#
1
2
3
4
5
6
7
8
 var collection = TLSCert(IdentityChain.ToArray(), options.fullIdentity.Leaf, options.fullIdentity.PrivateKey); // тут выгружаем коллекцию и добавляем приватный ключ в X509Certificate2
 var handler = new HttpClientHandler();
 handler.ClientCertificates.AddRange(collection);
GrpcChannel channel = GrpcChannel.ForAddress("https://localhost:443", new GrpcChannelOptions
            {
                HttpClient = new HttpClient(handler),
                Credentials = ChannelCredentials.SecureSsl,
            });
Собственно по сертификатам:
Cert - это сертификат соответствующий CA сертификату (ca.cert)
Leaf - это сертификат соответствующий сертификату (leaf.cert) и собственно приватный ключ именно от этого сертификата
0
HF
 Аватар для HF
1303 / 882 / 199
Регистрация: 09.09.2011
Сообщений: 2,590
Записей в блоге: 2
08.01.2024, 00:40
Смысл кода не совсем понятен. И я не занимался этим настолько плотно, но... интернет выдаёт похожие ответы. И все они ведут к тому что...

- стандартная практика - один сертификат
- и видимо это всё-таки сертификаты использующиеся для "рукопожатия"
- и на этом моменте мы начинаем "перебирать" коллекцию.

А обходной путь - опять же отключать валидацию сертификатов. И судя по названию "ServerCertificateCustomValidationCallba ck" - это всё же валидация серверного видимо с вашим клиентским. Вот и всё.

Configure Certificates with HttpClient Authentication
Add client certificate to .NET Core HttpClient

C#
1
2
3
4
handler.ServerCertificateCustomValidationCallback =
    (httpRequestMessage, cert, cetChain, policyErrors) => {
        return true;
    };
0
5 / 4 / 2
Регистрация: 12.07.2023
Сообщений: 69
12.01.2024, 20:26  [ТС]
Возможно кому-то будет полезным:

Добавлено через 13 минут
Возможно кому-то пригодится.
Судя по всему в C# нельзя передать кортеж сертификатов (например в GO tls.conn имеет поле peerCertificates для передачи кортежа)
Решение данной проблемы было таким: добавить два заголовка Client-Cert и Client-Cert-Chain. Client-Cert соответствует handler.ClientCertificates. Client-Cert-Chain это остальная цепочка сертификатов не включающая сертификат Client-Cert. Чуть больше можно найти об этом тут RFC 9440
https://datatracker.ietf.org/doc/rfc9440/. Одно но в данном документе указано что сертификат передается как DER base 64
In effect, this means that the binary DER certificate is encoded using base64 (without line breaks, spaces, or other characters outside the base64 alphabet) and delimited with colons on either side.
Я же решил передавать Rawdata.
P.S. если кто решит использовать DER base 64: RFC 2045, which defined Base64, REQUIRES a newline after 76 characters (max).Jul 3, 2017


C#
1
2
3
4
5
6
7
8
9
10
11
12
            var handler = new HttpClientHandler();
            handler.ClientCertificates.AddRange(collection);
            var httpClient = new HttpClient(handler);
            httpClient.DefaultRequestHeaders.Add("Client-Cert", $":{BitConverter.ToString(options.fullIdentity.RawChain()[0]).Replace("-","")}:");
            var opt = options.fullIdentity.RawChain().ToList();
            var header = CreateHeader(opt);
            httpClient.DefaultRequestHeaders.Add("Client-Cert-Chain", header);
            GrpcChannel channel = GrpcChannel.ForAddress("https://localhost:443", new GrpcChannelOptions
            {
                HttpClient = httpClient,
                Credentials = ChannelCredentials.SecureSsl,
            });
0
HF
 Аватар для HF
1303 / 882 / 199
Регистрация: 09.09.2011
Сообщений: 2,590
Записей в блоге: 2
12.01.2024, 21:23
Мне всё равно не понятен смысл этого действия - отправки цепочки сертификатов. Из прочитанного сделал вывод - что это цепочка серверных сертификатов для валидации клиентского. Если так, то зачем? ведь цепочку можно проверить самостоятельно, через сервера валидации. А тут передача каких то данных, типа данные настолько доверенные, что им нужно доверять обязательно. Странно.

Ну а про RFC. Там столько больших слов "Обязательно" "Не должно быть" "Должны" и всё связано с тем что эти данные настолько приватные и небезопасные, что не должны никуда утечь и их надо сжечь, удалить и всех свидетелей тоже устранить. Это значит что одно неловкое движение - и вы отправили в интернет секретную информацию. Ну такое...
0
5 / 4 / 2
Регистрация: 12.07.2023
Сообщений: 69
06.02.2024, 16:55  [ТС]
Идея была такая что это цепочка клиентских сертификатов отправляется на сервер для подписания. Получается что каждый узел имеет свой CA (ca.cert и ca.key) он самоподписанный. Также имеется identity который подписан CA (также содержит identity.cert и identity.key) более того identity еще может содержать Rest chain.
Структура identity:
CA Certificate =  это собственно публичный ключ от CA
Leaf Certificate = это собственно публичный ключ от identity подписанный CA
RestChain Certificate = это собственно сертификаты которые будут после подписания: публичный ключ CA и тд
Соответсвенно identity отправляется на подписание на сервер где на сервере он подписывается своим CA. Подписываем мы CA identity используя CA сервера. После подписания отправляем назад ответ: Подписанный сертификат (CA), публичный ключ CA сервера и то что в остальной цепочке. Leaf останется тем же.
Зачем же столько сертификатов: по идее identity Leaf должен использоваться для коммуникации. CA это по сути идентификатор.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
06.02.2024, 16:55
Помогаю со студенческими работами здесь

Колекция ответных док-ов
Есть три формы представляющие сабой иерархию, первая типа "Document", вторая и третья "ответ на ответ". Задача получить все...

Колекция в ArrayList<e> в Java
Доброе время суток!!! Я создал функцию возвращающий коллекцию обект. Вот теперь мне нужно ввести ее на консоль. ...

класс HttpContext
Не можете подкинуть статей и примеров по работе с классом HttpContext?И желательно обьясть что это такое.На msdn не особо понятьно

HttpContextBase и HttpContext
в классе Controller есть public HttpContextBase HttpContext { get; } HttpContextBase- abstract класс, статических членов нету, все...

httpcontext current = null
Добрый день. Подскажите пожалуйста из-за чего может быть такая проблема?


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru