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

Уведомление

Icon
Error

Опции
К последнему сообщению К первому непрочитанному
Offline Exs42  
#1 Оставлено : 7 июля 2010 г. 20:01:37(UTC)
Exs42

Статус: Новичок

Группы: Участники
Зарегистрирован: 07.07.2010(UTC)
Сообщений: 3
Откуда: Spb

Возникла такая проблема, при создании ЭЦП на этапе отправки CadesSignMessage выдаёт ошибку. Пример взят из стандартной документации КриптоПро по ЭЦП. Подскажите пожалуйста, что я забыл или чего не сделал. Заранее спасибо!

Вот собственно код:
Код:


#define empty		0;
#define CRYPT_SUCCESS	0;

#define CERT_STORE_NAME  L"MY"
#define SIGNER_NAME  L"DigiCert Global Root CA"
PCCERT_CONTEXT pSignerCert;

using namespace System;
using namespace System::Runtime::InteropServices;

int main()
{
    HCERTSTORE hStoreHandle;

	// Open a certificate store.
	

	if ( !( hStoreHandle = CertOpenStore(
	   CERT_STORE_PROV_SYSTEM,
	   0,
	   NULL,
	   CERT_SYSTEM_STORE_CURRENT_USER,
	   CERT_STORE_NAME)))
	{
		 Console::Write("The MY store could not be opened.");
	}

	if(pSignerCert = CertFindCertificateInStore(
	   hStoreHandle,
	   X509_ASN_ENCODING | PKCS_7_ASN_ENCODING,
	   0,
	   CERT_FIND_SUBJECT_STR,
           SIGNER_NAME,
	   NULL))
	{
		Console::Write("The signer's certificate was found.\n");
	}
	else
	{
		Console::Write( "Signer certificate not found.");
	}


	CRYPT_SIGN_MESSAGE_PARA signPara = { sizeof(signPara) };
        signPara.dwMsgEncodingType = X509_ASN_ENCODING | PKCS_7_ASN_ENCODING;
        signPara.pSigningCert = pSignerCert;//pContext; // 0 for window
        signPara.HashAlgorithm.pszObjId = (LPSTR)CertAlgIdToOID(CALG_MD5);//szOID_RSA_RSA;
	signPara.cMsgCert = 1;
	signPara.rgpMsgCert = &pSignerCert;
    
	CADES_SIGN_MESSAGE_PARA para = { sizeof(para) };
        para.pSignMessagePara = &signPara;

        char data[] = "Test";

        const BYTE* pbToBeSigned[] = { (BYTE*)data };
        DWORD cbToBeSigned[] = { strlen(data) };


        PCRYPT_DATA_BLOB pSignedMessage = 0;
        if(!CadesSignMessage(&para,false,1,pbToBeSigned,cbToBeSigned,
        &pSignedMessage))
       {
        std::cout << "CadesSignMessage() failed" << std::endl;
	std::getchar();
        return empty;
        }

        if(!CadesFreeBlob(pSignedMessage))
        {
        std::cout << "CadesFreeBlob() failed" << std::endl;
        std::getchar();
        return empty;
        }


        std::getchar();
	return CRYPT_SUCCESS;
}

Отредактировано пользователем 7 июля 2010 г. 20:02:11(UTC)  | Причина: Не указана

Offline Новожилова Елена  
#2 Оставлено : 8 июля 2010 г. 17:08:15(UTC)
Новожилова Елена

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

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

Поблагодарили: 99 раз в 95 постах
При таком способе создания подписи не заполняется поле pCadesSignPara структуры CADES_SIGN_MESSAGE_PARA. В этом случае используются значения членов CADES_SIGN_PARA по умолчанию.

В частности, будет создаваться подпись типа CAdES-X Long Type 1, в процессе формирования которой необходимо получить штампы времени. А для этого необходим адрес службы штампов времени, который можно задать:

- В настройках групповой политики
- В структуре CADES_SIGN_PARA (поле pTspConnectionPara)

Либо можно создавать "простейшую" ЭЦП формата CAdES BES, для формирования которой не используются штампы времени. В этом случае следует задать значение поля dwCadesType структуры CADES_SIGN_PARA равным CADES_BES.
Offline Exs42  
#3 Оставлено : 10 июля 2010 г. 16:13:25(UTC)
Exs42

Статус: Новичок

Группы: Участники
Зарегистрирован: 07.07.2010(UTC)
Сообщений: 3
Откуда: Spb

Спасибо за помощь! Разобрался.

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

Offline Exs42  
#4 Оставлено : 24 июля 2010 г. 21:06:55(UTC)
Exs42

Статус: Новичок

Группы: Участники
Зарегистрирован: 07.07.2010(UTC)
Сообщений: 3
Откуда: Spb

У меня ещё один вопрос.
Я создал ЭЦП и теперь мне нужно с помощью неё подписать документ.
Как это сделать? Нашёл вот такое решение:
Для создания электронной цифровой подписи необходимо вычислить хеш заданного файла и зашифровать этот "цифровой отпечаток сообщения" своим закрытым ключом - "подписать".
На сколько это правильно и есть ли другие решения проблемы?

Прошу прощения за может быть дурацкие вопросы, только начинаю знакомство с ЭЦП


Offline Новожилова Елена  
#5 Оставлено : 4 августа 2010 г. 17:41:13(UTC)
Новожилова Елена

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

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

Поблагодарили: 99 раз в 95 постах
Здравствуйте!

Вы уже создали электронную цифровую подпись (ЭЦП).

Что Вы понимаете под словами "подписать с помощью нее документ"?
Offline Hayk  
#6 Оставлено : 10 сентября 2010 г. 21:06:01(UTC)
Hayk

Статус: Новичок

Группы: Участники
Зарегистрирован: 10.09.2010(UTC)
Сообщений: 5
Откуда: Armenia Yerevan

Exs42 написал:
Возникла такая проблема, при создании ЭЦП на этапе отправки CadesSignMessage выдаёт ошибку. Пример взят из стандартной документации КриптоПро по ЭЦП. Подскажите пожалуйста, что я забыл или чего не сделал. Заранее спасибо!

in which programing language wrote this example, c# or c++?
I try compile this code in visual studio c ++ 6.0
get followin errors
'PCCERT_CONTEXT' : missing storage-class or type specifiers
software developer
www.developer.am
RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
Guest
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.