Статус: Участник
Группы: Участники
Зарегистрирован: 11.12.2011(UTC) Сообщений: 17
|
Поставил CSP + ЭЦП SDK лицензии на месте, до окончания еще почти 3 месяца. Скачал с тестового УЦ сертификат, установил в личное (Windows 7) Заставил пример (Создание подписи CAdES-BES (упрощённые функции)) скомпилироваться: Код:#include <windows.h>
#include <cades.h>
#include <iostream>
#include <vector>
#define CERT_STORE_NAME L"MY"
#define SIGNER_NAME L"Test Center CRYPTO-PRO"
#define empty 0
PCCERT_CONTEXT pSignerCert;
#pragma comment(lib, "crypt32")
#pragma comment(lib, "cades")
int main()
{
HCERTSTORE hStoreHandle;
if ( !( hStoreHandle = CertOpenStore(
CERT_STORE_PROV_SYSTEM,
0,
NULL,
CERT_SYSTEM_STORE_CURRENT_USER,
CERT_STORE_NAME))) {
std::cout << "The MY store could not be opened.\n" << std::endl;
}
if(pSignerCert = CertFindCertificateInStore(
hStoreHandle,
X509_ASN_ENCODING | PKCS_7_ASN_ENCODING,
0,
CERT_FIND_SUBJECT_STR,
SIGNER_NAME,
NULL)) {
std::cout << "The signer's certificate was found.\n" << std::endl;
} else {
std::cout << "Signer certificate not found.\n" << std::endl;
}
CRYPT_SIGN_MESSAGE_PARA signPara = { sizeof(signPara) };
signPara.dwMsgEncodingType = X509_ASN_ENCODING | PKCS_7_ASN_ENCODING;
signPara.pSigningCert = pSignerCert; // 0 for window
signPara.HashAlgorithm.pszObjId = szOID_OIWSEC_sha1;
CADES_SIGN_PARA cadesSignPara = { sizeof(cadesSignPara) };
cadesSignPara.dwCadesType = CADES_BES;
CADES_SIGN_MESSAGE_PARA para = { sizeof(para) };
para.pSignMessagePara = &signPara;
para.pCadesSignPara = &cadesSignPara;
std::vector<BYTE> data(10,25);
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;
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;
return empty;
}
// return message;
return empty;
}
Запускаю, получаю результат: Цитата:The signer's certificate was found. CadesSignMessage() failed Помогите разобраться! Где ошибка? что проверить? В конечном счете мне нужно будет реализовать подписывание и проверку подписи CADES_X_LONG_TYPE_1, но это уже следующий шаг. Пока не могу заставить работать более простой вариант. Отредактировано пользователем 13 декабря 2011 г. 6:03:51(UTC)
| Причина: Не указана
|
|
|
|
Статус: Сотрудник
Группы: Администраторы, Участники Зарегистрирован: 10.12.2008(UTC) Сообщений: 924 Откуда: Крипто-Про Поблагодарили: 99 раз в 95 постах
|
Вы установили сертификат тестового центра сертификации в хранилище "Личные" и пытаетесь создать на нем подпись?
Или вы получили свой сертификат на нашем тестовом УЦ? Тогда почему вы ищете в хранилище именно сертификат тестового удостоверяющего центра?
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 26.07.2011(UTC) Сообщений: 13,340 Сказал «Спасибо»: 550 раз Поблагодарили: 2212 раз в 1727 постах
|
Новожилова Елена написал:Вы установили сертификат тестового центра сертификации в хранилище "Личные" и пытаетесь создать на нем подпись?
Или вы получили свой сертификат на нашем тестовом УЦ? Тогда почему вы ищете в хранилище именно сертификат тестового удостоверяющего центра? или еще возможный, но маловероятный вариант = назвал свой сертификат так же "Test Center CRYPTO-PRO", получил и поставил в личные ;) |
|
|
|
|
Статус: Участник
Группы: Участники
Зарегистрирован: 11.12.2011(UTC) Сообщений: 17
|
Спасибо, все заработало. Чувствовал, что где-то протупил, а где, уже не соображу.
|
|
|
|
Статус: Участник
Группы: Участники
Зарегистрирован: 11.12.2011(UTC) Сообщений: 17
|
Даже стыдно спрашивать, но у меня опять не работает. Что в тот раз заработало уже не помню (проект был заморожен на 3 месяца). Итак, начну по порядку. Установлено КриптоПро CSP. Лицензии действующие. Получил сертификат УЦ: 1. Зашел сюда "https://www.cryptopro.ru/certsrv/". 2. Получить сертификат Удостоверяющего Центра или действующий список отозванных сертификатов 3. Загрузка сертификата ЦС 4. сохранил на диск 5. запустил и установил в "Доверенные корневые центры сертификации". Формирую ключи: 1. Зашел сюда "https://www.cryptopro.ru/certsrv/". 2. Сформировать ключи и отправить запрос на сертификат 3. Создать и выдать запрос к этому ЦС. 4. Имя "test_my", остальное все по умолчанию. 5. выбираю"Реестр", ввожу пароль, нажимаю "Установить сертификат" 6. Уаля: Новый сертификат успешно установлен. Беру пример "Создание подписи CAdES-BES (упрощённые функции)": Код:#include <windows.h>
#include <cades.h>
#include <iostream>
#include <vector>
#define CERT_STORE_NAME L"MY"
#define SIGNER_NAME L"test_my"
#define empty 0
PCCERT_CONTEXT pContext;
#pragma comment(lib, "crypt32")
#pragma comment(lib, "cades")
int main()
{
HCERTSTORE hStoreHandle;
if ( !( hStoreHandle = CertOpenStore(
CERT_STORE_PROV_SYSTEM,
0,
NULL,
CERT_SYSTEM_STORE_CURRENT_USER,
CERT_STORE_NAME))) {
std::cout << "The MY store could not be opened.\n" << std::endl;
}
if(pContext = CertFindCertificateInStore(
hStoreHandle,
X509_ASN_ENCODING | PKCS_7_ASN_ENCODING,
0,
CERT_FIND_SUBJECT_STR,
SIGNER_NAME,
NULL)) {
std::cout << "The signer's certificate was found.\n" << std::endl;
} else {
std::cout << "Signer certificate not found.\n" << std::endl;
}
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 = szOID_OIWSEC_sha1;
CADES_SIGN_PARA cadesSignPara = { sizeof(cadesSignPara) };
cadesSignPara.dwCadesType = CADES_BES;
CADES_SIGN_MESSAGE_PARA para = { sizeof(para) };
para.pSignMessagePara = &signPara;
para.pCadesSignPara = &cadesSignPara;
std::vector<BYTE> data(10,25);
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;
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;
return empty;
}
// return message;
return empty;
}
Результат: Цитата:The signer's certificate was found.
CadesSignMessage() failed Консоль вернула следующее: Цитата:Запускается J:\Qt\Temp\cert\cert-build-desktop\debug\cert.exe... .\Externs.cpp(33) : /Init/ .\CPSettings.cpp(193) : /Init/ cpcspi: Thread: file:line function text xcode(dcode) level: 0 cpcsp: Thread: file:line text level: 0 cpui: Thread: file:line function text xcode(dcode) level: 0 cprdr: Thread: file:line function text xcode(dcode) level: 0 cpext: Thread: file:line function text xcode(dcode) level: 0 J:\Qt\Temp\cert\cert-build-desktop\debug\cert.exe завершился с кодом 0 Подскажите, где копать? Голову свою уже сломал
|
|
|
|
Статус: Сотрудник
Группы: Администраторы, Участники Зарегистрирован: 10.12.2008(UTC) Сообщений: 924 Откуда: Крипто-Про Поблагодарили: 99 раз в 95 постах
|
Код ошибки какой? Пока что заметила - вы указываете алгоритм хэширования sha1. В сертификате какой ключ?
|
|
|
|
Статус: Участник
Группы: Участники
Зарегистрирован: 11.12.2011(UTC) Сообщений: 17
|
Да спасибо, заменил алгоритм хеширования на Код:signPara.HashAlgorithm.pszObjId = szOID_CP_GOST_R3411;
Но результат тот же. Правда консоль меньше вернула (нет пяти строк с "... level: 0"), так что уже прогресс. Код ошибки, возвращаемый через GetLastError(): 2148081675. Отредактировано пользователем 17 апреля 2012 г. 18:10:34(UTC)
| Причина: Не указана
|
|
|
|
Статус: Сотрудник
Группы: Администраторы, Участники Зарегистрирован: 10.12.2008(UTC) Сообщений: 924 Откуда: Крипто-Про Поблагодарили: 99 раз в 95 постах
|
Код ошибки, который вы видите - "Не удается найти сертификат и закрытый ключ для расшифровки. "
Сертификат точно установлен в хранилище с привязкой к закрытому ключу?
|
|
|
|
Статус: Участник
Группы: Участники
Зарегистрирован: 11.12.2011(UTC) Сообщений: 17
|
Да, никак не мог найти время, чтобы отписаться, все заработало, спасибо большое!
|
|
|
|
Быстрый переход
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.
Important Information:
The Форум КриптоПро uses cookies. By continuing to browse this site, you are agreeing to our use of cookies.
More Details
Close