Ключевое слово в защите информации
КЛЮЧЕВОЕ СЛОВО
в защите информации
Получить ГОСТ TLS-сертификат для домена (SSL-сертификат)
Добро пожаловать, Гость! Чтобы использовать все возможности Вход или Регистрация.

Уведомление

Icon
Error

Опции
К последнему сообщению К первому непрочитанному
Offline BrainStorm  
#1 Оставлено : 13 декабря 2011 г. 6:02:55(UTC)
BrainStorm

Статус: Участник

Группы: Участники
Зарегистрирован: 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(&para,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)  | Причина: Не указана

Offline Новожилова Елена  
#2 Оставлено : 13 декабря 2011 г. 17:16:36(UTC)
Новожилова Елена

Статус: Сотрудник

Группы: Администраторы, Участники
Зарегистрирован: 10.12.2008(UTC)
Сообщений: 924
Женщина
Откуда: Крипто-Про

Поблагодарили: 99 раз в 95 постах
Вы установили сертификат тестового центра сертификации в хранилище "Личные" и пытаетесь создать на нем подпись?

Или вы получили свой сертификат на нашем тестовом УЦ? Тогда почему вы ищете в хранилище именно сертификат тестового удостоверяющего центра?
Offline Андрей Писарев  
#3 Оставлено : 13 декабря 2011 г. 17:20:56(UTC)
Андрей *

Статус: Сотрудник

Группы: Участники
Зарегистрирован: 26.07.2011(UTC)
Сообщений: 13,340
Мужчина
Российская Федерация

Сказал «Спасибо»: 550 раз
Поблагодарили: 2212 раз в 1727 постах
Новожилова Елена написал:
Вы установили сертификат тестового центра сертификации в хранилище "Личные" и пытаетесь создать на нем подпись?

Или вы получили свой сертификат на нашем тестовом УЦ? Тогда почему вы ищете в хранилище именно сертификат тестового удостоверяющего центра?



или еще возможный, но маловероятный вариант = назвал свой сертификат так же "Test Center CRYPTO-PRO", получил и поставил в личные ;)



Техническую поддержку оказываем тут
Наша база знаний
Offline BrainStorm  
#4 Оставлено : 13 декабря 2011 г. 19:15:34(UTC)
BrainStorm

Статус: Участник

Группы: Участники
Зарегистрирован: 11.12.2011(UTC)
Сообщений: 17

Спасибо, все заработало.
Чувствовал, что где-то протупил, а где, уже не соображу. d'oh!
Offline BrainStorm  
#5 Оставлено : 13 апреля 2012 г. 5:04:41(UTC)
BrainStorm

Статус: Участник

Группы: Участники
Зарегистрирован: 11.12.2011(UTC)
Сообщений: 17

Даже стыдно спрашивать, но у меня опять не работает. Brick wall
Что в тот раз заработало уже не помню (проект был заморожен на 3 месяца). d'oh!

Итак, начну по порядку.
Установлено КриптоПро 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(&para,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


Подскажите, где копать? Голову свою уже сломал Brick wall
Offline Новожилова Елена  
#6 Оставлено : 13 апреля 2012 г. 21:30:40(UTC)
Новожилова Елена

Статус: Сотрудник

Группы: Администраторы, Участники
Зарегистрирован: 10.12.2008(UTC)
Сообщений: 924
Женщина
Откуда: Крипто-Про

Поблагодарили: 99 раз в 95 постах
Код ошибки какой?
Пока что заметила - вы указываете алгоритм хэширования sha1. В сертификате какой ключ?
Offline BrainStorm  
#7 Оставлено : 17 апреля 2012 г. 18:09:03(UTC)
BrainStorm

Статус: Участник

Группы: Участники
Зарегистрирован: 11.12.2011(UTC)
Сообщений: 17

Да спасибо, заменил алгоритм хеширования на
Код:
signPara.HashAlgorithm.pszObjId = szOID_CP_GOST_R3411;
Но результат тот же. Brick wall Правда консоль меньше вернула (нет пяти строк с "... level: 0"), так что уже прогресс.
Код ошибки, возвращаемый через GetLastError(): 2148081675.

Отредактировано пользователем 17 апреля 2012 г. 18:10:34(UTC)  | Причина: Не указана

Offline Новожилова Елена  
#8 Оставлено : 17 апреля 2012 г. 20:28:45(UTC)
Новожилова Елена

Статус: Сотрудник

Группы: Администраторы, Участники
Зарегистрирован: 10.12.2008(UTC)
Сообщений: 924
Женщина
Откуда: Крипто-Про

Поблагодарили: 99 раз в 95 постах
Код ошибки, который вы видите - "Не удается найти сертификат и закрытый ключ для расшифровки. "

Сертификат точно установлен в хранилище с привязкой к закрытому ключу?
Offline BrainStorm  
#9 Оставлено : 26 апреля 2012 г. 2:14:16(UTC)
BrainStorm

Статус: Участник

Группы: Участники
Зарегистрирован: 11.12.2011(UTC)
Сообщений: 17

Да, никак не мог найти время, чтобы отписаться, все заработало, спасибо большое!
RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
Guest (2)
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.