Статус: Новичок
Группы: Участники
Зарегистрирован: 17.10.2024(UTC) Сообщений: 6
Сказал(а) «Спасибо»: 2 раз
|
Есть задача: для определенных сертификатов в CpX509Store проверить доступность контейнера закрытого ключа. HasPrivateKey всего лишь говорит, о том, что в принципе есть связка с закрытым ключом. Любое обращение к PrivateKey (чтобы взять оттуда в итоге провайдера и CspKeyContainerInfo) при извлеченности носителя вызывает UI окно "не вставлен носитель". Как-то можно вывод окна подавить и обработать ошибку в таком случае самостоятельно? В дальнейшем еще понадобится тихая подпись без вставьте контейнер и без введите пин-код.
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 26.07.2011(UTC) Сообщений: 13,727   Сказал «Спасибо»: 574 раз Поблагодарили: 2303 раз в 1804 постах
|
Автор: romar777  Есть задача: для определенных сертификатов в CpX509Store проверить доступность контейнера закрытого ключа. HasPrivateKey всего лишь говорит, о том, что в принципе есть связка с закрытым ключом. Любое обращение к PrivateKey (чтобы взять оттуда в итоге провайдера и CspKeyContainerInfo) при извлеченности носителя вызывает UI окно "не вставлен носитель". Как-то можно вывод окна подавить и обработать ошибку в таком случае самостоятельно? В дальнейшем еще понадобится тихая подпись без вставьте контейнер и без введите пин-код. Имя контейнера (связка сертификата) можно запросить, не обращаясь к нему. Как минимум через p\invoke к MS CryptoApi |
|
|
|
|
Статус: Новичок
Группы: Участники
Зарегистрирован: 17.10.2024(UTC) Сообщений: 6
Сказал(а) «Спасибо»: 2 раз
|
Цитата:Имя контейнера (связка сертификата) можно запросить, не обращаясь к нему. Как минимум через p\invoke к MS CryptoApi В итоге сделал с помощью функций crypt32.dll. Просто думал, что можно проще (типа флага silent/noUI поставить - когда с JCP игрался вроде видел там подобное), не прибегая к низкоуровневому коду. К тому же в дальнейшем еще под Linux планируется...
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 20.02.2017(UTC) Сообщений: 221
Сказал(а) «Спасибо»: 4 раз Поблагодарили: 66 раз в 61 постах
|
Собрали для тестов новый Libcore, добавили public метод по получению информации о контейнере. Обращение к нему не открывает контейнер с ключом. Дальше можно попробовать открывать контейнер через создание провайдера с нужными флагами, добавив Flags = CspProviderFlags.NoPrompt | CspProviderFlags.UseExistingKey Код:CpCspParameters containerParams = cert.PrivateKeyCspParameters;
https://file.cryptopro.r...VW4Jmyvo03NG/libcore.zip |
|
 2 пользователей поблагодарили Артём Макаров за этот пост.
|
|
|
Статус: Новичок
Группы: Участники
Зарегистрирован: 17.10.2024(UTC) Сообщений: 6
Сказал(а) «Спасибо»: 2 раз
|
Автор: Артём Макаров  Собрали для тестов новый Libcore, добавили public метод по получению информации о контейнере. Обращение к нему не открывает контейнер с ключом. Дальше можно попробовать открывать контейнер через создание провайдера с нужными флагами, добавив Flags = CspProviderFlags.NoPrompt | CspProviderFlags.UseExistingKey Код:CpCspParameters containerParams = cert.PrivateKeyCspParameters;
Спасибо, работает ожидаемо. Имя контейнера получаем, тестируем подписание через создание провайдера с нужными флагами. Но есть момент если подписывать с CpCmsSigner: ComputeSignature(CpCmsSigner signer, bool silent); silent никак не влияет, описания нет, я предполагаю, что true для того чтобы не было окон типа "введите пин-код" (если не сохранен), но запрашивает все равно. Отредактировано пользователем 17 апреля 2025 г. 11:18:44(UTC)
| Причина: Не указана
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 20.02.2017(UTC) Сообщений: 221
Сказал(а) «Спасибо»: 4 раз Поблагодарили: 66 раз в 61 постах
|
Автор: romar777  Автор: Артём Макаров  Собрали для тестов новый Libcore, добавили public метод по получению информации о контейнере. Обращение к нему не открывает контейнер с ключом. Дальше можно попробовать открывать контейнер через создание провайдера с нужными флагами, добавив Flags = CspProviderFlags.NoPrompt | CspProviderFlags.UseExistingKey Код:CpCspParameters containerParams = cert.PrivateKeyCspParameters;
Спасибо, работает ожидаемо. Имя контейнера получаем, тестируем подписание через создание провайдера с нужными флагами. Но есть момент если подписывать с CpCmsSigner: ComputeSignature(CpCmsSigner signer, bool silent); silent никак не влияет, описания нет, я предполагаю, что true для того чтобы не было окон типа "введите пин-код" (если не сохранен), но запрашивает все равно. Тут исходная логика ms, данный флаг выставляет CRYPT_ACQUIRE_SILENT_FLAG при CryptAcquireCertificatePrivateKey. Почему при выставлении данного флага прокидывается окошко с пином - не готов сказать. Для CpCmsSigner есть конструктор с явной передачей закрытого ключа. Можно открывать ключ для параметров, проверять его наличие, и затем передавать в CpCmsSigner: Код:
CpCmsSigner(SubjectIdentifierType.IssuerAndSerialNumber, gostCert, gostKey)
|
|
|
|
|
Быстрый переход
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.
Important Information:
The Форум КриптоПро uses cookies. By continuing to browse this site, you are agreeing to our use of cookies.
More Details
Close