Статус: Эксперт
Группы: Участники
Зарегистрирован: 05.03.2015(UTC) Сообщений: 1,602  Откуда: Иркутская область Сказал(а) «Спасибо»: 110 раз Поблагодарили: 395 раз в 366 постах
|
Автор: seevve  обычно первый вызов возвращал везде нужный размер Действительно, чаще бывает так, но с функциями криптографии есть местами разночтения. Причем такие примечания к функциям указаны самой Майкрософт, то есть сложно грешить на автора криптопровайдера. Добавлю, что вышесказанное справедливо, когда возвращаются двоичные данные (например, хэш или двоичное значение параметра). Если та же функция возвращает текстовое значение параметра, то второй раз значение может быть не измениться, что означает "не установлено". Подробнее: записали на входе туда размер всего буфера, на выходе функции ничего не поменялось, но где-то в середине буфера функция записала символ 0, который символизирует конец строки. Если потом нужна длина значащих данных, этот 0 приходится выискивать. Конечно есть соответствующая функция нахождения длины в VC рантаймах или можно просто склеивать строки, не зная размера. Однако это все равно риск - как бы за буфер не вылететь в процессе склейки/установления длины, если 0 в буфере все-таки нет. Просто для профилактики полезно записывание 0 в начало текстового буфера перед вызовом и 0 в конец текстового буфера после возврата из функции. Автор: seevve  речь о CryptSetProvParam с параметром PP_SIGNATURE_PIN Да Автор: seevve  Фактически есть только PCCERT_CONTEXT pCertCtx. Можете подсказать как увязать результат CryptAcquireContext, с сертификатом? Или достаточно просто существования контекста с в момент вызова CryptSignMessage (тут я тоже не увидел как HCRYPTPROV можно было бы передать). Действительно, тогда проблемка - функции разного уровня, между ними будет сложно увязать передачу параметра. Навскидку мне приходит в голову либо использование как раз того эффекта запоминания в хранилище сертификатов. Либо даже хранилище не нужно: просто установка ссылки на контейнер на токене в контекст сертификата каждый раз, раз уж идет речь о работе с токенами. Там кажется были настройки кэширования (вот только я не помню кэширования пин-кода или хэндла HCRYPTPROV).
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 12.08.2013(UTC) Сообщений: 834   Откуда: Москва Сказал «Спасибо»: 5 раз Поблагодарили: 215 раз в 174 постах
|
Автор: two_oceans  Действительно, тогда проблемка - функции разного уровня, между ними будет сложно увязать передачу параметра. Навскидку мне приходит в голову либо использование как раз того эффекта запоминания в хранилище сертификатов. Либо даже хранилище не нужно: просто установка ссылки на контейнер на токене в контекст сертификата каждый раз, раз уж идет речь о работе с токенами. Там кажется были настройки кэширования (вот только я не помню кэширования пин-кода или хэндла HCRYPTPROV).
Добрый день. Можно сначала вызвать CryptAcquireCertificatePrivateKey (с флагами CRYPT_ACQUIRE_SILENT_FLAG | CRYPT_ACQUIRE_CACHE_FLAG) - он по PCCERT_CONTEXT вернет HCRYPTPROV, а в этот хэндл установить ПИН через PP_SIGNATURE_PIN. Установка CRYPT_ACQUIRE_CACHE_FLAG упрощает работу с функцией: не нужно освобождать полученный хэндл - он сам закроется при освобождении PCCERT_CONTEXT. После этого вызовы CryptSignMessage должны подхватывать пароль из кэша. |
|
 2 пользователей поблагодарили Grey за этот пост.
|
|
|
Статус: Участник
Группы: Участники
Зарегистрирован: 08.11.2021(UTC) Сообщений: 10  Откуда: Москва
|
Ещё один вопрос. А есть способ список контейнеров (ключей) только с USB токенов (rutoken/esmart/jacarta), в идеале ГОСТ2012 связанные с сертификатами подписи. Есть ощущение, что можно это сделать параметрами функции CryptAcquireContext, но не очень понятно как именно. С полученным криптопровайдеролм я потом вызываю CryptGetProvParam(hCryptProv, PP_ENUMCONTAINERS,...) для перебора всех ключей. (получения списка всех ключей с сертификатами). В предположении что изначально неизвестно какой токен воткнут (если не воткнут), список должен быть пустым.
|
|
|
|
Статус: Эксперт
Группы: Участники
Зарегистрирован: 05.03.2015(UTC) Сообщений: 1,602  Откуда: Иркутская область Сказал(а) «Спасибо»: 110 раз Поблагодарили: 395 раз в 366 постах
|
Добрый день. Всем будет проще если создавать новые темы под новые вопросы. Не понял в чем затруднение, если Вы уже получаете экземпляр криптопровайдера и перечисляете контейнеры. Через один вызов CryptAcquireContext я тоже не знаю как такого добиться. Для перечисления контейнеров можно взять экземпляр криптопровайдера без ключей (не указывать конкретное имя контейнера и использовать флаг VERIFY_CONTEXT). Далее по перечисленным именам сориентироваться какие из них токены. Если нужно сопоставить с установленными сертификатами в хранилище, то тут без перечисления хранилища сертификатов никак - контейнер на токене не хранит никакой информации о хранилище. С другой стороны, хранилище хранит ссылку на контейнер, но не отслеживает какой из них сейчас подключен.
Большинство плагинов решающих подобную задачу либо для каждого сертификата в хранилище перечисляют все токены либо для каждого токена перечисляют все сертификаты. Ну, строго говоря не ВСЕ, а в среднем половину, но это все равно дает почти квадратичную зависимость времени всего сопоставления от количества сертификатов/токенов. Если бы была возможность сделать флагом, думаю этим бы уже воспользовались. Хотя... кажется попадалось подобное в теме по Джаве и в итоге пришли к тому, что без разницы цикл что внутри криптопровайдера, что снаружи.
Можно сделать чуть быстрее если перечислить отдельно сертификаты и их ссылки на контейнер, отдельно токены потом сравнить 2 списка. Другой вариант - дергать CryptAcquireCertificatePrivateKey для каждого сертификата в хранилище и ловить ошибки, но это тоже так себе удовольствие.
Отредактировано пользователем 21 января 2022 г. 6:25:50(UTC)
| Причина: Не указана
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 12.08.2013(UTC) Сообщений: 834   Откуда: Москва Сказал «Спасибо»: 5 раз Поблагодарили: 215 раз в 174 постах
|
Автор: seevve  Ещё один вопрос. А есть способ список контейнеров (ключей) только с USB токенов (rutoken/esmart/jacarta), в идеале ГОСТ2012 связанные с сертификатами подписи. Есть ощущение, что можно это сделать параметрами функции CryptAcquireContext, но не очень понятно как именно. С полученным криптопровайдеролм я потом вызываю CryptGetProvParam(hCryptProv, PP_ENUMCONTAINERS,...) для перебора всех ключей. (получения списка всех ключей с сертификатами). В предположении что изначально неизвестно какой токен воткнут (если не воткнут), список должен быть пустым. Добрый день. Есть два варианта. У каждого свои недостатки: 1) Перечислить сертификаты в хранилище и выбрать те, у которых есть ссылка на закрытый ключ. Ссылка включает в себя имя контейнера и имя провайдера, которым контейнер можно открыть. Плюсы: вы сможете получить список контейнеров, даже если токен не вставлен. Минусы: сертификаты в хранилище обычного никто не чистит, так что на пользовательской машине может быть много мусора. 2) Перечислить контейнеры (PP_ENUMCONTAINERS) с флагом CRYPT_UNIQUE, выбрать те, у которых есть подстрока SCARD, последовательно их открывать и проверять сертификат (GetKeyParam(KP_CERTIFICATE)). В Windows есть специальная служба, которая автоматически ставит сертификат в Личное хранилище при подключении токена, так что с высокой вероятностью, если вы смогли перечислить токен с сертификатом, этот серт есть в хранилище. Ну а если нет, можете тут же сами кодом и установить. Плюсы: никакого мусора Минусы: медленнее; перечислятся только контейнеры с подключенных токенов |
|
|
|
|
Статус: Участник
Группы: Участники
Зарегистрирован: 08.11.2021(UTC) Сообщений: 10  Откуда: Москва
|
two_oceans, Grey - спасибо за ответы, просматривая примеры просто видел передачу в одну из функций что-то вроде регекспа, но вероятно это было где-то в другом месте, если вообще в CryptoAPI. (Мне отчего то подумалось, что можно передать что-то типа "*SCARD*" равно как и имя ключа контейнера, из документации это ниоткуда не следовало, так что мои фантазии). Целевая платформа предполагается вроде бы сертифицированый линукс (Astra?), так что про установку сертификатов интересно, команду использую, но она предполагает, что сертификат есть на файловой системе. Впринципе и через popen ожно дёрнуть. Цитата:/opt/cprocsp/bin/amd64/certmgr -inst -cont '\\.\PKCS11 Aktiv Rutoken ECP - CP 00 00 0\ID_63727970746f76735f696e76697369626c655f74657374' -file test.cer А можете подсказать, при вот таком вот выводе pkcs11tool
pkcs11-tool --module /usr/lib/librtpkcs11ecp.so -O -p NNNNNNNN Using slot 0 with a present token (0x0) Data object 20511177
Private Key Object; GOSTR3410-2012-256 PARAMS OID: 06072a850302022301 label: ID: 63727970746f76735f696e76697369626c655f7465737432 Usage: sign Access: sensitive, always sensitive, never extractable, local Certificate Object; type = X.509 cert label: subject: DN: CN=emailAddress=some@mail.ru, L=Moscow, C=RU, SN=..., GN=... ID: 63727970746f76735f696e76697369626c655f7465737432
есть программная возможность поставить сертификат с токена к контейнеру? Нет уверенности, что крипто про вообще видит этот сертификат. Так же интересна установка сертификата с носителя на который записывался ключ (и вероятно) сертификат средствами криптопро. Полагаю это может быть полезно. У меня пока такого токена нет под рукой, но если можно програмно доустановить сертификат я бы это реализовал. На первый взгляд пример /opt/cprocsp/src/samples/CSP/InstallCert предполагает установку не с ключевого носителя. Отредактировано пользователем 24 января 2022 г. 15:38:49(UTC)
| Причина: Не указана
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 12.08.2013(UTC) Сообщений: 834   Откуда: Москва Сказал «Спасибо»: 5 раз Поблагодарили: 215 раз в 174 постах
|
Автор: seevve  про установку сертификатов интересно, команду использую, но она предполагает, что сертификат есть на файловой системе. Впринципе и через popen ожно дёрнуть. Цитата:/opt/cprocsp/bin/amd64/certmgr -inst -cont '\\.\PKCS11 Aktiv Rutoken ECP - CP 00 00 0\ID_63727970746f76735f696e76697369626c655f74657374' -file test.cer есть программная возможность поставить сертификат с токена к контейнеру? Нет уверенности, что крипто про вообще видит этот сертификат. Так же интересна установка сертификата с носителя на который записывался ключ (и вероятно) сертификат средствами криптопро. Полагаю это может быть полезно. У меня пока такого токена нет под рукой, но если можно програмно доустановить сертификат я бы это реализовал. На первый взгляд пример /opt/cprocsp/src/samples/CSP/InstallCert предполагает установку не с ключевого носителя. Честно говоря, не уверен, что до конца вас понял. Если стоит задача: установить сертификаты с токена в хранилище с правильной привязкой, наиболее простой способ - вызвать Код:/opt/cprocsp/bin/amd64/csptest -absorb -certs -autoprov
В эту же команду при необходимости можно добавить фильтр по токенам и типам носителей. Например, чтобы ставить серты только с токенов и не трогать HDIMAGE, можно добавить |
|
|
|
|
Статус: Участник
Группы: Участники
Зарегистрирован: 08.11.2021(UTC) Сообщений: 10  Откуда: Москва
|
Цитата:/opt/cprocsp/bin/amd64/csptest -absorb -certs -autoprov пробовал на моём токене к установке сертификата не приводило, а вот команада из моего сообщения работала, впрочем спишу на токен не записанный средставами криптопро. Спасибо. Про программную реализацию я имел ввиду пример кода реализующий функционал команды из вашего сообщения, хотел поразбираться почему с моим токеном не работала и/или научить работать с токенами подобными моему.
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 12.08.2013(UTC) Сообщений: 834   Откуда: Москва Сказал «Спасибо»: 5 раз Поблагодарили: 215 раз в 174 постах
|
Автор: seevve  Цитата:/opt/cprocsp/bin/amd64/csptest -absorb -certs -autoprov пробовал на моём токене к установке сертификата не приводило, а вот команада из моего сообщения работала, впрочем спишу на токен не записанный средставами криптопро. Спасибо. Про программную реализацию я имел ввиду пример кода реализующий функционал команды из вашего сообщения, хотел поразбираться почему с моим токеном не работала и/или научить работать с токенами подобными моему. Пример кода я не дам, к сожалению. Могу посоветовать посмотреть вот в какую сторону: - получить сертификаты с правильными ссылками в сериализованном store: CryptGetProvParam(PP_USER_CERTSTORE, CP_CRYPT_SERIALIZED_STORE); - открыть его с помощью CertOpenStore(CERT_STORE_PROV_SERIALIZED); - пройтись в цикле с помощью CertEnumCertificatesInStore и ставить в хранилище CertAddCertificateContextToStore. Если получать PP_USER_CERTSTORE в контексте, открытом по имени считывателя, то туда попадут только сертификаты с токена. Обратите внимание, что для PKCS11-ключей в CSP 5.0.12000 нужно использовать другое имя считывателя! Не "Aktiv Rutoken ECP", а "PKCS11 Aktiv Rutoken ...". Это было исправлено в CSP 5.0 R3. |
|
|
|
|
Быстрый переход
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.
Important Information:
The Форум КриптоПро uses cookies. By continuing to browse this site, you are agreeing to our use of cookies.
More Details
Close