Jump to content

Recommended Posts

Добрый день!

Согласно документу http://egov.samregion.ru/external/elgov/files/c_11087/Spetsifikatsiya_trebovanij_k_mehanizmam_postanovki_i_proverki_EP.pdf можно использовать VipNet CSP для подписи XML-документов по стандарту OASIS Standard 200401. Подскажите, как это сделать (из командной строки или какую кнопку нажать).

Заранее спасибо за ответ.

Share this post


Link to post
Share on other sites

Сомневаюсь, что VipNet CSP это умеет в режиме командной строки, да и вовсе это не функция криптопровайдера. Эта функция прикладного уровня. То есть, в том же .NET, JAVA или на другой платформе разработки Вам нужно просто заставить использовать именно данный криптопровайдер (или данный алгоритм шифрования), чтобы прикладная библиотека сформировала подпись через VipNet CSP. Но никак не из консоли.

Share this post


Link to post
Share on other sites

Добрый день.

Изучаю ваш пример реализации логики на C#

https://github.com/Infotecs/CSharpViPNetCSP

интересует момент взаимодействия с электронным сертификатом

можно его получать с помощью контейнера ключей?

или предполагается использовать системное хранилище Windows и т.п.

Share this post


Link to post
Share on other sites

CryptAcquireContext

Добрый день.

Изучаю ваш пример реализации логики на C#

https://github.com/I...CSharpViPNetCSP

интересует момент взаимодействия с электронным сертификатом

можно его получать с помощью контейнера ключей?

или предполагается использовать системное хранилище Windows и т.п.

CryptAcquireContext

CryptGetUserKey

CryptGetKeyParam( .. KP_CERTIFICATE .., cb )

выделить память cb для pbCertificate

CryptGetKeyParam( .. KP_CERTIFICATE, pbCertificate, cb )

pCertContext = CertCreateCertificateContext( X509_ASN_ENCODING, pbCertificate, cb )

Share this post


Link to post
Share on other sites

pisarev.aa

очень помогло, спасибо.

ещё вопрос по теме подписи:

возникает ошибка `Ключ не существует` при создании сигнатуры подписи

if (!CryptoApi.CryptSignHash(handler, (int)keyNumber, null, flags, null, ref signatureSize))

смущает то, что с контейнером ключей из примера всё прекрасно работает,

а контейнер созданный утилитой `Создание запроса на сертификат` радует этой ошибкой.

завтра проверю на других версиях Vipnet Csp

Share this post


Link to post
Share on other sites

если в окне `Создание запроса на сертификат` в группе `параметры сертификата`

для пункта `Назначение` установить только подпись ошибка не возникает.

почему так?

Share this post


Link to post
Share on other sites

В контейнере может быть два ключа. Значение keyNumber в вызове должно соответствовать номеру того ключа, который есть в контейнере (1 или 2). В примере используется ключ только подписи с номером 2. Если вы начинаете использовать контейнер, в котором ключа с номером 2 нет, происходит такая ошибка. См. AT_SIGNATURE в MSDN.

Share this post


Link to post
Share on other sites

В контейнере может быть два ключа. Значение keyNumber в вызове должно соответствовать номеру того ключа, который есть в контейнере (1 или 2). В примере используется ключ только подписи с номером 2. Если вы начинаете использовать контейнер, в котором ключа с номером 2 нет, происходит такая ошибка. См. AT_SIGNATURE в MSDN.

с видами ключей понятно. спасибо.

мучает ещё один момент:

когда получаю из контейнера публичный ключ

методом CryptoApi.CryptExportKey(.. PublicKeyBlob..

он на совпадает с открытым ключём из сертификата этого же контейнера

в запросе на сертификат код совпадает с сертификатом.

Share this post


Link to post
Share on other sites

Разобрался. в сертификате хранится сжатая версия открытого ключа.

для получения полной версии нужно создать контейнер ключей, и импортировать туда ключ из сертификата.

работающий пример реализации: https://github.com/Ranmoro/CSharpViPNetCSP

огромное спасибо всем тем, кто помогал.

на этом всё.

Share this post


Link to post
Share on other sites

Добрый день.

Помогите, пожалуйста, разобраться в следующей проблеме:

В системе установлена ViPNet CSP 3.2 (11.16035).

Подписываю XML при помощи контейнера (№1) ключей, в котором указано, что алгоритм закрытого ключа - ГОСТ Р 34.10-2001. Всё успешно.

Далее пробую подписывать XML при помощи контейнера (№2), в котором алгоритм - ГОСТ Р 34.10-2001 DH. Но получаю ошибку "Ключ не существует" при вызове метода CryptSignHash.

В обоих случаях указываю имя провайдера - Infotecs Cryptographic Service Provider, а тип провайдера - 2.

Использую пример из https://github.com/Infotecs/CSharpViPNetCSP.

При этом программа ViPNet CryptoFile успешно подписывает файл используя контейнер №2.

Что я делаю неправильно?

Share this post


Link to post
Share on other sites

У меня такая ситуация: проект на java + jna + MS Crypto API работает отлично с криптопро.

Випнет тоже реализует MS Crypto API, но при этом падает при подписании хеша. И магическим образом может инициализироваться с типом 2 и 75(на тестовой машине криптопро не стояло ни разу)

Ошибка - Error "0x80090022 Provider could not perform the action since the context was acquired as silent. Как будто випнет хочет открыть какое-то окно...что делать? Если контекст делать не тихим, то валится с ошибкой

не может найти ключ. В чём проблема? Проект на шарпе недоступен

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×

Important Information

By using this site, you agree to our Terms of Use.