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

Уведомление

Icon
Error

2 Страницы<12
Опции
К последнему сообщению К первому непрочитанному
Offline Андрей Писарев  
#11 Оставлено : 9 августа 2019 г. 20:28:36(UTC)
Андрей *

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

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

Сказал «Спасибо»: 494 раз
Поблагодарили: 2035 раз в 1579 постах
Вопрос изначальный, кстати, корректный про получить сертификаты, которые на токене.. Или речь про... контейнеры?

Если контейнеры, ответ очевиден. А если про сертификаты, которые в контейненах на токене и вообще не установлены в Личное...?
Техническую поддержку оказываем тут
Наша база знаний
Offline Alex_DotNETAlexAlex_DotNET112358  
#12 Оставлено : 12 августа 2019 г. 14:45:41(UTC)
Alex_DotNETAlexAlex_DotNET112358

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

Группы: Участники
Зарегистрирован: 13.03.2019(UTC)
Сообщений: 79
Российская Федерация

Сказал(а) «Спасибо»: 4 раз
сейчас интересует именно пройтись по сертификатам личного хранилища и определить, какие на токене

Еще вопрос: как определить что для этого сертификата токен вставлен? (без отображения окна криптопро CSP пользователю)
Спасибо
Offline Андрей Писарев  
#13 Оставлено : 12 августа 2019 г. 14:52:13(UTC)
Андрей *

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

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

Сказал «Спасибо»: 494 раз
Поблагодарили: 2035 раз в 1579 постах
Автор: Alex_DotNETAlexAlex_DotNET112358 Перейти к цитате
сейчас интересует именно пройтись по сертификатам личного хранилища и определить, какие на токене

Еще вопрос: как определить что для этого сертификата токен вставлен? (без отображения окна криптопро CSP пользователю)
Спасибо



например:
а) Получить имена контейнеров из связки с сертификатами из Личное
б) Перечислить доступные контейнеры

Найти а) в б)

Отредактировано пользователем 12 августа 2019 г. 14:52:44(UTC)  | Причина: Не указана

Техническую поддержку оказываем тут
Наша база знаний
Offline two_oceans  
#14 Оставлено : 13 августа 2019 г. 7:20:02(UTC)
two_oceans

Статус: Эксперт

Группы: Участники
Зарегистрирован: 05.03.2015(UTC)
Сообщений: 1,602
Российская Федерация
Откуда: Иркутская область

Сказал(а) «Спасибо»: 110 раз
Поблагодарили: 393 раз в 366 постах
Ага, только пожалуйста не вызывайте б) для каждого сертификата. Это приводит к росту времени примерно пропорционально квадрату количества сертификатов (как, например, у плагина госуслуг) - считая что контейнеров M примерно столько же сколько сертификатов N и игнорируя множители константы. Уже с 10-16 сертификатами становится проблематично дождаться пока все отработает. А чем больше времени прошло тем больше вероятность, что пользователь за это время уже подключил или отключил токен.

В идеале что вроде такого:
а) перечисляем сертификаты в хранилище - добавляем имена контейнеров в список для проверки;
б) перечисляем контейнеры - добавляем имена в список контейнеров;
в) после перечисления сравниваем список контейнеров со списком на проверку - ставим для сертификатов с найденными контейнерами результат "Доступен контейнер", для сертификатов с ненайденными контейнерами результат "Не подключен носитель". Для контейнеров отсутствующих в списке проверки "Не установлен сертификат в хранилище" (не уточняя есть ли сертификат в контейнере или лежит где-то рядом или вообще на стадии выпуска).

в) конечно тоже пропорционально квадрату количества сертификатов, но сравнение строки в памяти гораздо быстрее чем нахождение контейнера на внешнем носителе. Кроме того, готовый список контейнеров можно отсортировать по имени (в идеале N*ln N) и потом искать половинным делением (как по индексу с допустимыми совпадающими значениями ln N), а контейнеры неизвестно в каком порядке перечислятся и их придется перечислять "до победного" (то есть в среднем перечислить половину контейнеров для каждого сертификата что дает N*M/2).

По поводу опроса контейнеров на предмет наличия сертификатов - есть очевидный минус в том, что может потребоваться ввод пин-кода при обращении к контейнеру. Конечно я знаю, что сертификат лежит в контейнере на флешке в незашифрованном виде и пин-кода для считывания сертификата как бы не нужно, однако помню как при каком-то поиске каждый раз выходил запрос пин-кода пока не найдется нужный сертификат либо пока пин-код не будет будет запомнен. Подскажите пожалуйста если опросить сертификаты в контейнерах можно без пин-кода.

Отредактировано пользователем 13 августа 2019 г. 7:46:13(UTC)  | Причина: Не указана

Offline Агафьин Сергей  
#15 Оставлено : 13 августа 2019 г. 13:54:44(UTC)
Grey

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

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

Сказал «Спасибо»: 5 раз
Поблагодарили: 215 раз в 174 постах
Автор: Alex_DotNETAlexAlex_DotNET112358 Перейти к цитате
сейчас интересует именно пройтись по сертификатам личного хранилища и определить, какие на токене

Еще вопрос: как определить что для этого сертификата токен вставлен? (без отображения окна криптопро CSP пользователю)
Спасибо


Тут два варианта.
1) Простой в реализации, но потенциально тяжелый в работе: получили ссылку, проверили, что начинается с SCARD, делаем CryptAcquireContext на это имя. Если успех - CryptReleaseContext. Успех - токен есть, нет - токена нет.
2) Более сложный в реализации, но самый быстрый: до перечисления сертификатов перечисляйте считыватели с получением уникальных имен считывателей функцией CryptGetProvParam(PP_ENUMREADERS, CRYPT_MEDIA), из псевдоструктуры CRYPT_ENUMREADER_INFO_MEDIA достаем поле szMedia и, если оно отличается от NO_MEDIA, NO_UNIQUE и INVALID_MEDIA, сохраняем. В результате получится список unique-имен подключенных носителей (они вида rutoken_lt_11111111, etoken_java_5555555). Это имена стоят на втором месте в ссылках на закрытый ключ после SCARD: "SCARD\rutoken_lt_11111111\0A00\ABCD". Собственно, вам нужно просто убедиться, для проверяемого сертификата в запасенном списке носителей есть совпадение.

С уважением,
Сергей
Техническую поддержку оказываем здесь.
Наша база знаний.
Offline LONG11  
#16 Оставлено : 2 апреля 2021 г. 18:15:09(UTC)
LONG11

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

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

Сказал(а) «Спасибо»: 24 раз
Автор: Агафьин Сергей Перейти к цитате
Автор: Alex_DotNETAlexAlex_DotNET112358 Перейти к цитате
Добрый день!

Как программно определить сертификаты которые на токене?

Например в личном хранилище несколько сертификатов, часть в реестре, часть на токене. Нужно выбрать те, которые на токене.

Спасибо.


Добрый день.
Если сертификат установлен с привязкой к закрытому ключу, то можно получить описатель этой привязки CertGetCertificateContextProperty (CERT_KEY_PROV_INFO_PROP_ID). В результате получите структуру CRYPT_KEY_PROV_INFO, в которой есть поле pwszContainerName. Это поле определяет, где лежит закрытый ключ. Если он на токене, то в ссылка будет начиинаться со слова "SCARD".


А если выдается без "SCARD", то как бы его получить?
CSP 4.0.9963

certinfo_pwszContainerName.jpg (59kb) загружен 11 раз(а).

UP Разобрался. Извините.

Отредактировано пользователем 2 апреля 2021 г. 18:29:15(UTC)  | Причина: Не указана

Offline LONG11  
#17 Оставлено : 2 апреля 2021 г. 18:40:39(UTC)
LONG11

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

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

Сказал(а) «Спасибо»: 24 раз
Автор: LONG11 Перейти к цитате
Автор: Агафьин Сергей Перейти к цитате
Автор: Alex_DotNETAlexAlex_DotNET112358 Перейти к цитате
Добрый день!

Как программно определить сертификаты которые на токене?

Например в личном хранилище несколько сертификатов, часть в реестре, часть на токене. Нужно выбрать те, которые на токене.

Спасибо.


Добрый день.
Если сертификат установлен с привязкой к закрытому ключу, то можно получить описатель этой привязки CertGetCertificateContextProperty (CERT_KEY_PROV_INFO_PROP_ID). В результате получите структуру CRYPT_KEY_PROV_INFO, в которой есть поле pwszContainerName. Это поле определяет, где лежит закрытый ключ. Если он на токене, то в ссылка будет начиинаться со слова "SCARD".


А если выдается без "SCARD", то как бы его получить?
CSP 4.0.9963

certinfo_pwszContainerName.jpg (59kb) загружен 11 раз(а).

UP Разобрался. Извините.


Но как я понял, имена контейнеров c "SCARD" и просто, как у меня на скрине с точки зрения привязки закрытого ключа - идентичны. При любом варианте указания имени сертификат обратится к ключу на Токене.

Поэтому если указывать привязку не через оснастку Сервис "CSP", то можно задать любой вариант имени, а структура CERT_KEY_PROV_INFO_PROP_ID будет выдавать то имя контейнера, которое привязали. Так что, можно получить имя без "SCARD" и это введет в заблуждение.
RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
2 Страницы<12
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.