| ||||
| ||||
Здравствуйте! Производится попытка подписать XML алгоритмом ГОСТ при помощи КриптоПро 3, используется библиотека msxml5.dll. Возникают следующие ошибки: 1. Если оставить все как в примере, идущим с КриптоПро 3, находящимся в файлеXMLSignForVerify.cpp, то сертификат в хранилище не находится. В командной строке указывается имя сертификата (то, что записано в CN поля Субъекта). 2. Если в критериях выбора сертификата поставить "первый попавшийся из хранилища" (CERT_FIND_ANY), то сертификат находится. Но возникает другая проблема. По умолчанию для подписывания в том примере задан параметр CERTIFICATES, при этом не добавляются записи в поле XML-документа ds:KeyInfo (хотя по описанию должны-бы браться некоторые данные сертификата). Но для корректной верификации подписи необходимо, чтобы там были сведения о сертификате и ключе. Для этого должен служить параметр KEYVALUE при подписи. Но если его указать, то в библиотечной функции xmldsig->sign() происходит ошибка и падает Эксепшн. Есть ли у Вас какие-нибудь мысли по этому поводу? Как надо указывать имя сертификата, чтобы он находился при поиске в хранилище? Что сделать, чтобы данные о ключах записывались в ds:KeyInfo, но не было ошибки. Спасибо! | ||||
Ответы: | ||||
| ||||
KEYVALUE пока не поддерживается, Поддерживается только CERTIFICATES (В документ добавляется BASE64 сертификат). А пример сейчас проверю. | ||||
| ||||
2 mAxDM: Спасибо за ответ. При использовании CERTIFICATES не создается нода ".//ds:KeyInfo/ds:X509Data", соотв., при верификации говорится, что все не гуд. | ||||
| ||||
Пример в порядке, просто используемый ключ и провайдер должны совпадать. либо оба 75 типа, либо оба 71. #define PROV_GOST_2001_DH 75 //71 работоспособность подписи проще смотреть в MS Infopath. | ||||
| ||||
Ни 71, ни 75 не дают никаких полей в ds:KeyInfo - этот тэг по-прежнему пуст. При верификации надо, чтобы в этом тэге были поля, а их нет, поэтому верификация не проходит. Подписывал на VC++ и на JavaScript - результат один и тот же. Ну и поиск сертификатов в хранилище не идет. Может, подскажете, что надо писать в качестве ключа для поиска? Я пишу "Test-1". SUBJECT_CN моего сертификата имеет вид: CN = Test-1 OU = разработчики ПО O = FIRMNAME L = Санкт-Петербург S = Санкт-Петербург C = RU E = mail@mail.ru | ||||
| ||||
Странно, у меня пример работает. Можно заменить строчку IXMLDSigKeyPtr pKey = xmldsig->createKeyFromCSP(PROV_GOST_2001_DH, "", CONT_NAME, 0); на IXMLDSigKeyPtr pKey = xmldsig->createKeyFromCSP(pbData->dwProvType, "", CONT_NAME, 0); | ||||
| ||||
Кажется, я понял в чем проблема - соберите пример в Юникоде | ||||
| ||||
2 mAxDM: check mail | ||||
| ||||
Юиикод не помог. Тем более, что в JS все равно не пашет. | ||||
| ||||
Попробуйте пока с ключом в реестре, а с дискетой завтра разберусь. | ||||