Форум КриптоПро
»
Общие вопросы
»
Общие вопросы
»
Как программно определить сертификаты которые на токене?
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 26.07.2011(UTC) Сообщений: 12,630 Сказал «Спасибо»: 494 раз Поблагодарили: 2035 раз в 1579 постах
|
Вопрос изначальный, кстати, корректный про получить сертификаты, которые на токене.. Или речь про... контейнеры?
Если контейнеры, ответ очевиден. А если про сертификаты, которые в контейненах на токене и вообще не установлены в Личное...? |
|
|
|
|
Статус: Активный участник
Группы: Участники
Зарегистрирован: 13.03.2019(UTC) Сообщений: 79 Сказал(а) «Спасибо»: 4 раз
|
сейчас интересует именно пройтись по сертификатам личного хранилища и определить, какие на токене
Еще вопрос: как определить что для этого сертификата токен вставлен? (без отображения окна криптопро CSP пользователю) Спасибо
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 26.07.2011(UTC) Сообщений: 12,630 Сказал «Спасибо»: 494 раз Поблагодарили: 2035 раз в 1579 постах
|
Автор: Alex_DotNETAlexAlex_DotNET112358 сейчас интересует именно пройтись по сертификатам личного хранилища и определить, какие на токене
Еще вопрос: как определить что для этого сертификата токен вставлен? (без отображения окна криптопро CSP пользователю) Спасибо например: а) Получить имена контейнеров из связки с сертификатами из Личное б) Перечислить доступные контейнеры Найти а) в б) Отредактировано пользователем 12 августа 2019 г. 14:52:44(UTC)
| Причина: Не указана |
|
|
|
|
Статус: Эксперт
Группы: Участники
Зарегистрирован: 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)
| Причина: Не указана
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 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". Собственно, вам нужно просто убедиться, для проверяемого сертификата в запасенном списке носителей есть совпадение. |
|
|
|
|
Статус: Активный участник
Группы: Участники
Зарегистрирован: 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)
| Причина: Не указана
|
|
|
|
Статус: Активный участник
Группы: Участники
Зарегистрирован: 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" и это введет в заблуждение.
|
|
|
|
Форум КриптоПро
»
Общие вопросы
»
Общие вопросы
»
Как программно определить сертификаты которые на токене?
Быстрый переход
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.
Important Information:
The Форум КриптоПро uses cookies. By continuing to browse this site, you are agreeing to our use of cookies.
More Details
Close