02.03.2005 16:40:04Подписывание XML-документа по ГОСТу Ответов: 9
Иван
Здравствуйте!
Производится попытка подписать XML алгоритмом ГОСТ при помощи КриптоПро 3, используется библиотека msxml5.dll.
Возникают следующие ошибки:
1. Если оставить все как в примере, идущим с КриптоПро 3, находящимся в файлеXMLSignForVerify.cpp, то сертификат в хранилище не находится. В командной строке указывается имя сертификата (то, что записано в CN поля Субъекта).

2. Если в критериях выбора сертификата поставить "первый попавшийся из хранилища" (CERT_FIND_ANY), то сертификат находится. Но возникает другая проблема. По умолчанию для подписывания в том примере задан параметр CERTIFICATES, при этом не добавляются записи в поле XML-документа ds:KeyInfo (хотя по описанию должны-бы браться некоторые данные сертификата). Но для корректной верификации подписи необходимо, чтобы там были сведения о сертификате и ключе. Для этого должен служить параметр KEYVALUE при подписи. Но если его указать, то в библиотечной функции xmldsig->sign() происходит ошибка и падает Эксепшн.

Есть ли у Вас какие-нибудь мысли по этому поводу?
Как надо указывать имя сертификата, чтобы он находился при поиске в хранилище?
Что сделать, чтобы данные о ключах записывались в ds:KeyInfo, но не было ошибки.

Спасибо!
 
Ответы:
02.03.2005 16:49:25mAxDM
KEYVALUE пока не поддерживается, Поддерживается только CERTIFICATES (В документ добавляется BASE64 сертификат). А пример сейчас проверю.
02.03.2005 16:56:47Иван
2 mAxDM:
Спасибо за ответ.
При использовании CERTIFICATES не создается нода ".//ds:KeyInfo/ds:X509Data", соотв., при верификации говорится, что все не гуд.
02.03.2005 17:29:09mAxDM
Пример в порядке, просто используемый ключ и провайдер должны совпадать.
либо оба 75 типа, либо оба 71.
#define PROV_GOST_2001_DH 75 //71
работоспособность подписи проще смотреть в MS Infopath.
02.03.2005 17:44:25Иван
Ни 71, ни 75 не дают никаких полей в ds:KeyInfo - этот тэг по-прежнему пуст.
При верификации надо, чтобы в этом тэге были поля, а их нет, поэтому верификация не проходит.
Подписывал на VC++ и на JavaScript - результат один и тот же.
Ну и поиск сертификатов в хранилище не идет. Может, подскажете, что надо писать в качестве ключа для поиска? Я пишу "Test-1". SUBJECT_CN моего сертификата имеет вид:
CN = Test-1
OU = разработчики ПО
O = FIRMNAME
L = Санкт-Петербург
S = Санкт-Петербург
C = RU
E = mail@mail.ru
02.03.2005 17:46:28mAxDM
Странно, у меня пример работает.
Можно заменить строчку
IXMLDSigKeyPtr pKey = xmldsig->createKeyFromCSP(PROV_GOST_2001_DH, "", CONT_NAME, 0);
на
IXMLDSigKeyPtr pKey = xmldsig->createKeyFromCSP(pbData->dwProvType, "", CONT_NAME, 0);
02.03.2005 17:51:38mAxDM
Кажется, я понял в чем проблема - соберите пример в Юникоде
02.03.2005 17:51:57Иван
2 mAxDM: check mail
02.03.2005 17:53:47Иван
Юиикод не помог. Тем более, что в JS все равно не пашет.
02.03.2005 22:18:21mAxDM
Попробуйте пока с ключом в реестре, а с дискетой завтра разберусь.