Ключевое слово в защите информации
КЛЮЧЕВОЕ СЛОВО
в защите информации
Получить ГОСТ TLS-сертификат для домена (SSL-сертификат)
Добро пожаловать, Гость! Чтобы использовать все возможности Вход или Регистрация.

Уведомление

Icon
Error

4 Страницы123>»
Опции
К последнему сообщению К первому непрочитанному
Offline Андрей Врагов  
#1 Оставлено : 25 августа 2020 г. 18:52:03(UTC)
Андрей Врагов

Статус: Участник

Группы: Участники
Зарегистрирован: 11.04.2017(UTC)
Сообщений: 25

Сказал(а) «Спасибо»: 1 раз
Всем доброго дня!

Интересует способ построения в .NET Framework/Core (C#) списка сертификатов субъектов, выданных на одном и том же корне. Имеется двухуровневая схема УЦ (корневой и подчиненный) и конечные субъекты. Как оптимально построить список сертификатов субъектов, чьи цепочки доверия имеют один и тот же корень? Пока вижу только один способ - построение цепочек по каждому сертификату субъекта до корня, и если корень удовлетворяет условиям поиска, то добавление серта субъекта в список. Интересут, например, вариант сделать это с использованием класса Enumerable из namespace'а System.Linq. Но как связать два серта субъекта и УЦ, по какому свойству? Насколько я понимаю, прямой связи между сертами нет, а есть только связь посредством ЭП серта субъекта выданного на ключе УЦ. Т.е. необходима проверка ЭП серта субъекта при помощи серта УЦ. И если я прав, то класс X509Chain строит цепочку доверия как раз используя эти проверки ЭП.
В общем хотелось бы услышать мнения мастеров.
Offline Андрей *  
#2 Оставлено : 25 августа 2020 г. 19:00:55(UTC)
Андрей *

Статус: Сотрудник

Группы: Участники
Зарегистрирован: 26.07.2011(UTC)
Сообщений: 13,340
Мужчина
Российская Федерация

Сказал «Спасибо»: 550 раз
Поблагодарили: 2212 раз в 1727 постах
Здравствуйте.

Строить по Идентификатору ключа ЦС.
Техническую поддержку оказываем тут
Наша база знаний
Offline Андрей Врагов  
#3 Оставлено : 26 августа 2020 г. 18:31:47(UTC)
Андрей Врагов

Статус: Участник

Группы: Участники
Зарегистрирован: 11.04.2017(UTC)
Сообщений: 25

Сказал(а) «Спасибо»: 1 раз
Автор: Андрей * Перейти к цитате
Здравствуйте.

Строить по Идентификатору ключа ЦС.


var caKeyId = x509.Extensions.Cast<X509Extension>()
.Where(n => n.Oid.Value.Equals("2.5.29.35"))
.Select(n => new AsnEncodedData(n.Oid, n.RawData))
.Select(n => n.Format(true))
.FirstOrDefault();

При помощи такого кода я выбираю содержимое, но там кроме идентификатора ключа ЦС присутствует и другая информация типа серийного номера серта и названия ЦС. Есть ли варианты сразу получить только ИД ключа ЦС или надо самому парсить содержимое?
Offline Андрей *  
#4 Оставлено : 26 августа 2020 г. 18:43:16(UTC)
Андрей *

Статус: Сотрудник

Группы: Участники
Зарегистрирован: 26.07.2011(UTC)
Сообщений: 13,340
Мужчина
Российская Федерация

Сказал «Спасибо»: 550 раз
Поблагодарили: 2212 раз в 1727 постах
Можно декодировать или просто взять 20 байтов,
это sha1 от структуры с открытым ключом Уц, в hex 40 длина, её показывает ОС.
Техническую поддержку оказываем тут
Наша база знаний
Offline Андрей Врагов  
#5 Оставлено : 27 августа 2020 г. 18:42:26(UTC)
Андрей Врагов

Статус: Участник

Группы: Участники
Зарегистрирован: 11.04.2017(UTC)
Сообщений: 25

Сказал(а) «Спасибо»: 1 раз
Автор: Андрей * Перейти к цитате
Можно декодировать или просто взять 20 байтов,
это sha1 от структуры с открытым ключом Уц, в hex 40 длина, её показывает ОС.

А как декодировать? Вроде как в .NET нет такого класса, который бы соответствовал расширению AKI. Или можно каким-то образом использовать CX509ExtensionAuthorityKeyIdentifier из CERTENROLLLib? Я попытался, но не понял как использовать метод InitializeDecode. Просто не хочется колхозить самому и разбирать байтовый массив AKI, чтобы вытащить оттуда поле keyIdentifier. Понимаю, что это абсолютно несложно сделать, но хотелось бы воспользоваться какими-то стандартными инструментами.
P.S. Кстати, насколько я понял из описания Microsoft для расширения AKI, цеопчка доверия как раз и строится на его основе и расширения SKI из серта вышестоящего УЦ. Т.е. в поле keyIdentifier из AKI записывается sha1 от PublicKey УЦ. Но sha1 вроде как признан уязвимым еще несколько лет назад. Тогда собственно доверие к цепочке, построенной таким образом, тоже пропадает.

Offline Андрей Врагов  
#6 Оставлено : 27 августа 2020 г. 18:44:40(UTC)
Андрей Врагов

Статус: Участник

Группы: Участники
Зарегистрирован: 11.04.2017(UTC)
Сообщений: 25

Сказал(а) «Спасибо»: 1 раз
Да, кстати, получать keyIdentifier через подсчет sha1 от открытого ключа вышестоящего УЦ тоже не хочется. А вдруг завтра это уже не будет sha1.
Offline Андрей *  
#7 Оставлено : 27 августа 2020 г. 18:46:55(UTC)
Андрей *

Статус: Сотрудник

Группы: Участники
Зарегистрирован: 26.07.2011(UTC)
Сообщений: 13,340
Мужчина
Российская Федерация

Сказал «Спасибо»: 550 раз
Поблагодарили: 2212 раз в 1727 постах
Автор: Андрей Врагов Перейти к цитате
Но sha1 вроде как признан уязвимым еще несколько лет назад. Тогда собственно доверие к цепочке, построенной таким образом, тоже пропадает.


не имеет отношения ... хеш - для быстрого поиска - есть ли в хранилище такой сертификат, далее - выполняется же .. проверка самой подписи в выданном сертификате с учётом найденного сертификата УЦ.
Техническую поддержку оказываем тут
Наша база знаний
Offline Андрей *  
#8 Оставлено : 27 августа 2020 г. 18:55:38(UTC)
Андрей *

Статус: Сотрудник

Группы: Участники
Зарегистрирован: 26.07.2011(UTC)
Сообщений: 13,340
Мужчина
Российская Федерация

Сказал «Спасибо»: 550 раз
Поблагодарили: 2212 раз в 1727 постах
Автор: Андрей Врагов Перейти к цитате
Да, кстати, получать keyIdentifier через подсчет sha1 от открытого ключа вышестоящего УЦ тоже не хочется. А вдруг завтра это уже не будет sha1.


RFC будут менять для начала... софт переписывать все...


Код:



 foreach (X509Extension extension in  Certificate.Extensions)

 if (extension.Oid.Value.ToString() == "2.5.29.35")

  использовать extension.RawData.Length
  и extension.RawData 


типа:
  StringBuilder sb2 = new StringBuilder();

 if (extension.RawData.Length > 30)
                         {
                             for (int i = 6; i < 26; i++)
                             {
                                 sb2.Append(extension.RawData[i].ToString("X2"));
                             }
                         }
                         else
                         {
                             for (int i = 4; i < extension.RawData.Length; i++)
                             {
                                 sb2.Append(extension.RawData[i].ToString("X2"));
                             }
                         }




Техническую поддержку оказываем тут
Наша база знаний
Offline Андрей *  
#9 Оставлено : 27 августа 2020 г. 19:15:06(UTC)
Андрей *

Статус: Сотрудник

Группы: Участники
Зарегистрирован: 26.07.2011(UTC)
Сообщений: 13,340
Мужчина
Российская Федерация

Сказал «Спасибо»: 550 раз
Поблагодарили: 2212 раз в 1727 постах
Два варианта:

1.
Snimok ehkrana ot 2020-08-27 20-12-59.png (77kb) загружен 8 раз(а).

2.
Snimok ehkrana ot 2020-08-27 20-14-18.png (69kb) загружен 8 раз(а).



Техническую поддержку оказываем тут
Наша база знаний
Offline KDA  
#10 Оставлено : 28 августа 2020 г. 13:00:33(UTC)
KDA

Статус: Активный участник

Группы: Участники
Зарегистрирован: 12.10.2009(UTC)
Сообщений: 42

Сказал(а) «Спасибо»: 4 раз
Поблагодарили: 6 раз в 6 постах
Прошу прощения, что встреваю, но истина дороже :)

RFC 5280 не имеет требований, что идентификатор ключа должен быть 20 байтов или что это должен быть SHA-1
Оговорка про 20 октетов есть у серйиного номера, но это несколько другое.

На практике видел сертификаты, у которых это поле было большей размерности. И это удовлетворяло формулировкам упомянутого RFC.
RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
Guest
4 Страницы123>»
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.