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

Уведомление

Icon
Error

2 Страницы<12
Опции
К последнему сообщению К первому непрочитанному
Offline two_oceans  
#11 Оставлено : 27 декабря 2021 г. 6:39:54(UTC)
two_oceans

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

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

Сказал(а) «Спасибо»: 110 раз
Поблагодарили: 393 раз в 366 постах
Автор: seevve Перейти к цитате
обычно первый вызов возвращал везде нужный размер
Действительно, чаще бывает так, но с функциями криптографии есть местами разночтения. Причем такие примечания к функциям указаны самой Майкрософт, то есть сложно грешить на автора криптопровайдера. Добавлю, что вышесказанное справедливо, когда возвращаются двоичные данные (например, хэш или двоичное значение параметра).

Если та же функция возвращает текстовое значение параметра, то второй раз значение может быть не измениться, что означает "не установлено". Подробнее: записали на входе туда размер всего буфера, на выходе функции ничего не поменялось, но где-то в середине буфера функция записала символ 0, который символизирует конец строки.

Если потом нужна длина значащих данных, этот 0 приходится выискивать. Конечно есть соответствующая функция нахождения длины в VC рантаймах или можно просто склеивать строки, не зная размера. Однако это все равно риск - как бы за буфер не вылететь в процессе склейки/установления длины, если 0 в буфере все-таки нет. Просто для профилактики полезно записывание 0 в начало текстового буфера перед вызовом и 0 в конец текстового буфера после возврата из функции.
Автор: seevve Перейти к цитате
речь о CryptSetProvParam с параметром PP_SIGNATURE_PIN
Да
Автор: seevve Перейти к цитате
Фактически есть только PCCERT_CONTEXT pCertCtx. Можете подсказать как увязать результат CryptAcquireContext, с сертификатом? Или достаточно просто существования контекста с в момент вызова CryptSignMessage (тут я тоже не увидел как HCRYPTPROV можно было бы передать).
Действительно, тогда проблемка - функции разного уровня, между ними будет сложно увязать передачу параметра. Навскидку мне приходит в голову либо использование как раз того эффекта запоминания в хранилище сертификатов. Либо даже хранилище не нужно: просто установка ссылки на контейнер на токене в контекст сертификата каждый раз, раз уж идет речь о работе с токенами. Там кажется были настройки кэширования (вот только я не помню кэширования пин-кода или хэндла HCRYPTPROV).

Offline Grey  
#12 Оставлено : 27 декабря 2021 г. 10:29:33(UTC)
Grey

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

Группы: Участники
Зарегистрирован: 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 должны подхватывать пароль из кэша.
С уважением,
Сергей
Техническую поддержку оказываем здесь.
Наша база знаний.
thanks 2 пользователей поблагодарили Grey за этот пост.
Андрей * оставлено 27.12.2021(UTC), two_oceans оставлено 27.12.2021(UTC)
Offline seevve  
#13 Оставлено : 20 января 2022 г. 18:22:30(UTC)
seevve

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

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

Ещё один вопрос. А есть способ список контейнеров (ключей) только с USB токенов (rutoken/esmart/jacarta), в идеале ГОСТ2012 связанные с сертификатами подписи.
Есть ощущение, что можно это сделать параметрами функции CryptAcquireContext, но не очень понятно как именно.
С полученным криптопровайдеролм я потом вызываю CryptGetProvParam(hCryptProv, PP_ENUMCONTAINERS,...) для перебора всех ключей. (получения списка всех ключей с сертификатами).
В предположении что изначально неизвестно какой токен воткнут (если не воткнут), список должен быть пустым.
Offline two_oceans  
#14 Оставлено : 21 января 2022 г. 6:23:47(UTC)
two_oceans

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

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

Сказал(а) «Спасибо»: 110 раз
Поблагодарили: 393 раз в 366 постах
Добрый день.
Всем будет проще если создавать новые темы под новые вопросы.
Не понял в чем затруднение, если Вы уже получаете экземпляр криптопровайдера и перечисляете контейнеры. Через один вызов CryptAcquireContext я тоже не знаю как такого добиться. Для перечисления контейнеров можно взять экземпляр криптопровайдера без ключей (не указывать конкретное имя контейнера и использовать флаг VERIFY_CONTEXT). Далее по перечисленным именам сориентироваться какие из них токены.

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

Отредактировано пользователем 21 января 2022 г. 6:25:50(UTC)  | Причина: Не указана

Offline Grey  
#15 Оставлено : 21 января 2022 г. 10:25:26(UTC)
Grey

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

Группы: Участники
Зарегистрирован: 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 есть специальная служба, которая автоматически ставит сертификат в Личное хранилище при подключении токена, так что с высокой вероятностью, если вы смогли перечислить токен с сертификатом, этот серт есть в хранилище. Ну а если нет, можете тут же сами кодом и установить.
Плюсы: никакого мусора
Минусы: медленнее; перечислятся только контейнеры с подключенных токенов
С уважением,
Сергей
Техническую поддержку оказываем здесь.
Наша база знаний.
Offline seevve  
#16 Оставлено : 24 января 2022 г. 15:36:34(UTC)
seevve

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

Группы: Участники
Зарегистрирован: 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


есть программная возможность поставить сертификат с токена к контейнеру?
Нет уверенности, что крипто про вообще видит этот сертификат.
Так же интересна установка сертификата с носителя на который записывался ключ (и вероятно) сертификат средствами криптопро. Полагаю это может быть полезно. У меня пока такого токена нет под рукой, но если можно програмно доустановить сертификат я бы это реализовал.
На первый взгляд пример /opt/cprocsp/src/samples/CSP/InstallCert предполагает установку не с ключевого носителя.

Отредактировано пользователем 24 января 2022 г. 15:38:49(UTC)  | Причина: Не указана

Offline Grey  
#17 Оставлено : 24 января 2022 г. 17:33:11(UTC)
Grey

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

Группы: Участники
Зарегистрирован: 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, можно добавить
Код:
-pattern SCARD
С уважением,
Сергей
Техническую поддержку оказываем здесь.
Наша база знаний.
Offline seevve  
#18 Оставлено : 24 января 2022 г. 17:49:53(UTC)
seevve

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

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

Цитата:
/opt/cprocsp/bin/amd64/csptest -absorb -certs -autoprov

пробовал на моём токене к установке сертификата не приводило, а вот команада из моего сообщения работала, впрочем спишу на токен не записанный средставами криптопро.

Спасибо. Про программную реализацию я имел ввиду пример кода реализующий функционал команды из вашего сообщения, хотел поразбираться почему с моим токеном не работала и/или научить работать с токенами подобными моему.
Offline Grey  
#19 Оставлено : 24 января 2022 г. 18:27:00(UTC)
Grey

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

Группы: Участники
Зарегистрирован: 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.
С уважением,
Сергей
Техническую поддержку оказываем здесь.
Наша база знаний.
RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
2 Страницы<12
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.