Статус: Участник
Группы: Участники
Зарегистрирован: 10.10.2022(UTC) Сообщений: 20
Сказал(а) «Спасибо»: 4 раз
|
Добрый день! Есть задача подписать PDF усиленной квалифицированной подписью с использованием рутокена ("флешки"). Чтобы разобраться, пробую собирать и запускать примеры. Сертификат установлен в личное хранилище. Взял из справочника по ЭЦП SDK: Создание подписи (упрощённые функции)На вход подаю файл PDF, функция завершается успехом. При попытке проверки результирующего файла через Инструменты КриптоПро (5.0.125000) получаю ошибку: Выбранный файл не является подписью или повреждён. Подпись и последующая проверка этого же документа через Инструменты КриптоПро завершается успешно. Сравнение результирующих файлов показало, что в версии из примера в конце файла не хватает блока информации. При этом часть данных добавляется и совпадает с корректной версией. Из того, что можно прочитать в недостающем куске, вижу информацию о субъекте и поставщике. При этом часть информации о поставщике присутствует и в моей, и в корректной версии В примере поменял signPara.HashAlgorithm.pszObjId, поскольку с исходным попытка подписать заканчивалась ошибкой 0х80092004 Ниже код используемой функции Код:std::vector<BYTE> CreateSignSimpleExample(PCCERT_CONTEXT pContext, const std::vector<BYTE> &data)
{
CRYPT_SIGN_MESSAGE_PARA signPara = { sizeof(signPara) };
signPara.dwMsgEncodingType = X509_ASN_ENCODING | PKCS_7_ASN_ENCODING;
signPara.pSigningCert = pContext; // 0 for window
signPara.HashAlgorithm.pszObjId = (LPSTR)szOID_CP_GOST_R3411_12_256; //был szOID_OIWSEC_sha1;
CADES_SIGN_PARA cadesSignPara = { sizeof(cadesSignPara) };
cadesSignPara.dwCadesType = CADES_BES;
cadesSignPara.pSignerCert = pContext;
CADES_SIGN_MESSAGE_PARA para = { sizeof(para) };
para.pSignMessagePara = &signPara;
para.pCadesSignPara = &cadesSignPara;
std::vector<BYTE> empty;
const BYTE *pbToBeSigned[] = { &data[0] };
DWORD cbToBeSigned[] = { (DWORD)data.size() };
PCRYPT_DATA_BLOB pSignedMessage = 0;
if(!CadesSignMessage(¶, FALSE, 1, pbToBeSigned, cbToBeSigned, &pSignedMessage))
{
std::cout << "CadesSignMessage() failed" << std::endl;
//std::cout << getLastError() << std::endl;
return empty;
}
std::vector<BYTE> message(pSignedMessage->cbData);
std::copy(pSignedMessage->pbData, pSignedMessage->pbData + pSignedMessage->cbData, message.begin());
if(!CadesFreeBlob(pSignedMessage))
{
std::cout << "CadesFreeBlob() failed" << std::endl;
std::cout << "Error:" << GetLastError() << std::endl;
return empty;
}
return message;
}
Что я делаю не так? Отредактировано пользователем 10 октября 2022 г. 16:37:15(UTC)
| Причина: Не указана
|
|
|
|
Статус: Участник
Группы: Участники
Зарегистрирован: 10.10.2022(UTC) Сообщений: 20
Сказал(а) «Спасибо»: 4 раз
|
Нашел, что нужно было добавить не хватающие данные через signPara.cMsgCert = 1; signPara.rgpMsgCert = &pContext; Теперь они появляются, однако в самом начале и в конце файлов есть разница, которая всё ещё не позволяет пройти проверку подписи Код:std::vector<BYTE> CreateSignSimpleExample(PCCERT_CONTEXT pContext, const std::vector<BYTE> &data)
{
CRYPT_SIGN_MESSAGE_PARA signPara = { sizeof(signPara) };
signPara.dwMsgEncodingType = X509_ASN_ENCODING | PKCS_7_ASN_ENCODING;
signPara.pSigningCert = pContext; // 0 for window
signPara.HashAlgorithm.pszObjId = (LPSTR)szOID_CP_GOST_R3411_12_256; //szOID_OIWSEC_sha1;
signPara.cMsgCert = 1;
signPara.rgpMsgCert = &pContext;
CADES_SIGN_PARA cadesSignPara = { sizeof(cadesSignPara) };
cadesSignPara.dwCadesType = CADES_BES;
cadesSignPara.pSignerCert = pContext;
CADES_SIGN_MESSAGE_PARA para = { sizeof(para) };
para.pSignMessagePara = &signPara;
para.pCadesSignPara = &cadesSignPara;
std::vector<BYTE> empty;
const BYTE *pbToBeSigned[] = { &data[0] };
DWORD cbToBeSigned[] = { (DWORD)data.size() };
PCRYPT_DATA_BLOB pSignedMessage = 0;
if(!CadesSignMessage(¶, FALSE, 1, pbToBeSigned, cbToBeSigned, &pSignedMessage))
{
ofs << "CadesSignMessage() failed" << std::endl;
//ofs << getLastError() << std::endl;
return empty;
}
std::vector<BYTE> message(pSignedMessage->cbData);
std::copy(pSignedMessage->pbData, pSignedMessage->pbData + pSignedMessage->cbData, message.begin());
if(!CadesFreeBlob(pSignedMessage))
{
ofs << "CadesFreeBlob() failed" << std::endl;
ofs << "Error:" << GetLastError() << std::endl;
return empty;
}
return message;
}
|
|
|
|
Статус: Участник
Группы: Участники
Зарегистрирован: 10.10.2022(UTC) Сообщений: 20
Сказал(а) «Спасибо»: 4 раз
|
Почему полученная таким способом подпись не проходит проверку в КриптоПро?
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 26.07.2011(UTC) Сообщений: 12,719 Сказал «Спасибо»: 500 раз Поблагодарили: 2054 раз в 1594 постах
|
Автор: smd44 однако в самом начале и в конце файлов есть разница, которая всё ещё не позволяет пройти проверку подписи Что имеется ввиду, каким ПО анализируется? Выложить pdf и подпись тестовые можете? Через стороннее ПО проверяли, хеш файла не сходится? |
|
|
|
|
Статус: Участник
Группы: Участники
Зарегистрирован: 10.10.2022(UTC) Сообщений: 20
Сказал(а) «Спасибо»: 4 раз
|
Пробовал упростить задачу и подписать txt файл с содержимым "1234567890" Итог аналогичный. Получаю файл размером около 4 Кб. Моя версия не проходит проверку в Инструментах КриптоПро с той же ошибкой (Выбранный файл не является подписью или повреждён). Сравнивал через Compare в Notepad++, Utf8 Разница в 3 местах: 1)Самое начало (правильная версия справа) begin.JPG (46kb) загружен 8 раз(а).2) Самый конец (правильная версия сверху) end.JPG (54kb) загружен 4 раз(а).3) строка с датой-временем подписания, там разница только в цифрах, они читаемы и не вызывают вопросов. В остальном файлы совпадают. Выложить целиком, к сожалению, не могу, боюсь скомпрометировать личные данные. Вероятно, ошибка в передаваемых CadesSignMessage параметрах Отредактировано пользователем 12 октября 2022 г. 10:23:58(UTC)
| Причина: Не указана
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 26.07.2011(UTC) Сообщений: 12,719 Сказал «Спасибо»: 500 раз Поблагодарили: 2054 раз в 1594 постах
|
|
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 26.07.2011(UTC) Сообщений: 12,719 Сказал «Спасибо»: 500 раз Поблагодарили: 2054 раз в 1594 постах
|
Автор: smd44 Вероятно, ошибка в передаваемых CadesSignMessage параметрах Обычно возникают ошибки в функциях и отказ. Здесь же - формируется cms. |
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 26.07.2011(UTC) Сообщений: 12,719 Сказал «Спасибо»: 500 раз Поблагодарили: 2054 раз в 1594 постах
|
test (pfx).zip (3kb) загружен 1 раз(а).пароль: 123456 |
|
1 пользователь поблагодарил Андрей * за этот пост.
|
smd44 оставлено 12.10.2022(UTC)
|
|
Статус: Участник
Группы: Участники
Зарегистрирован: 10.10.2022(UTC) Сообщений: 20
Сказал(а) «Спасибо»: 4 раз
|
Автор: Андрей * test (pfx).zip (3kb) загружен 1 раз(а).пароль: 123456 Попытка подписать с помощью Вашего сертификата: test.zip (2kb) загружен 1 раз(а).
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 26.07.2011(UTC) Сообщений: 12,719 Сказал «Спасибо»: 500 раз Поблагодарили: 2054 раз в 1594 постах
|
неправильно сохраняете CMS в файл. |
|
|
|
|
Быстрый переход
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.
Important Information:
The Форум КриптоПро uses cookies. By continuing to browse this site, you are agreeing to our use of cookies.
More Details
Close