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

Уведомление

Icon
Error

3 Страницы123>
Опции
К последнему сообщению К первому непрочитанному
Offline forik  
#1 Оставлено : 24 февраля 2012 г. 19:55:34(UTC)
forik

Статус: Активный участник

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

Сказал(а) «Спасибо»: 2 раз
Здравствуйте! Подскажите пожалуйста, каким образом правильно записывать результат выполнения функции CryptSignMessage (а именно pbSignedMessageBlob) в файл, а затем и считывать из файла?
Я действовал с помощью сишных функций fopen/fread/fwrite и std::fstream. Проблема в том, что при чтении подписи из файла (в который ранее записалась подпись) и дальнейшей передачи этих данных в CryptVerifyDetachedMessageSignature верификация не проходит. Сертификат тестовый от КриптоПро.

PS Еще такой вопрос: Подпись, созданная на основе тестового сертификата должна проходить проверку на notary.cryptopro.ru ?
Добавляю сам файл и полученную подпись.
Вложение(я):
numonly.txt (1kb) загружен 28 раз(а).
sign_pkcs7.sig (1kb) загружен 42 раз(а).

У Вас нет прав для просмотра или загрузки вложений. Попробуйте зарегистрироваться.
Offline Андрей Писарев  
#2 Оставлено : 24 февраля 2012 г. 19:58:25(UTC)
Андрей *

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

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

Сказал «Спасибо»: 618 раз
Поблагодарили: 2392 раз в 1881 постах
forik написал:
Здравствуйте! Подскажите пожалуйста, каким образом правильно записывать результат выполнения функции CryptSignMessage (а именно pbSignedMessageBlob) в файл, а затем и считывать из файла?
Я действовал с помощью сишных функций fopen/fread/fwrite и std::fstream. Проблема в том, что при чтении подписи из файла (в который ранее записалась подпись) и дальнейшей передачи этих данных в CryptVerifyDetachedMessageSignature верификация не проходит. Сертификат тестовый от КриптоПро.

PS Еще такой вопрос: Подпись, созданная на основе тестового сертификата должна проходить проверку на notary.cryptopro.ru ?
Добавляю сам файл и полученную подпись.


где:
1) текст\код ошибки
2) сертификат подписанта (серийный номер 735FF9C800020001D4A0 ) вложенный в ЭЦП (или как минимум - отдельным файлом)

из присланного:
без сертификата подписи - проверить ЭЦП не получиться.
сама структура - Pkcs7 - корректная

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

Техническую поддержку оказываем тут
Наша база знаний
Offline Андрей Писарев  
#3 Оставлено : 24 февраля 2012 г. 20:02:24(UTC)
Андрей *

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

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

Сказал «Спасибо»: 618 раз
Поблагодарили: 2392 раз в 1881 постах
Цитата:
Подпись, созданная на основе тестового сертификата должна проходить проверку на notary.cryptopro.ru ?


сама подпись (правильно сделанная) будет проходить проверку,
сертификат УЦ - если он в доверенных на notary.cryptopro.ru - тогда тоже будет

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

Техническую поддержку оказываем тут
Наша база знаний
Offline forik  
#4 Оставлено : 24 февраля 2012 г. 20:13:44(UTC)
forik

Статус: Активный участник

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

Сказал(а) «Спасибо»: 2 раз
Ошибка 80070057.
Вложение(я):
certnew.cer (2kb) загружен 10 раз(а).

У Вас нет прав для просмотра или загрузки вложений. Попробуйте зарегистрироваться.
Offline Андрей Писарев  
#5 Оставлено : 24 февраля 2012 г. 20:38:36(UTC)
Андрей *

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

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

Сказал «Спасибо»: 618 раз
Поблагодарили: 2392 раз в 1881 постах
подправь код, вложи сертификат в ЭЦП ...


HRESULT=0x80070057: параметр задан неверно.



upd:
наконец-то получен ответ от экстрасенсов из отпуска:


показывай давай...

Отредактировано пользователем 25 февраля 2012 г. 0:39:38(UTC)  | Причина: Не указана

Техническую поддержку оказываем тут
Наша база знаний
Offline forik  
#6 Оставлено : 25 февраля 2012 г. 11:25:14(UTC)
forik

Статус: Активный участник

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

Сказал(а) «Спасибо»: 2 раз
Офф :Прошу прощения ) Сам не люблю подобное, но иногда туплю )

Подпись:

Код:
char *fileContent;
	 ifstream file("c:\\path\\numonly.txt", ios::in | ios::binary | ios::ate);
	 ifstream::pos_type size1 = file.tellg();
	 fileContent = new char[size1];
	 file.seekg(0, ios::beg);
	 file.read(fileContent, size1);
	 file.close();
	 fileContent[size1] = '\0';
 	 BYTE* pbMessage = (BYTE *)fileContent;
 	 DWORD cbMessage = (DWORD)strlen((char*) pbMessage) + 1;

         HCERTSTORE hStoreHandle = 0; 

         if ( !( hStoreHandle = CertOpenStore(
		                           CERT_STORE_PROV_SYSTEM,
		                           0,
		                           NULL,
		                           CERT_SYSTEM_STORE_CURRENT_USER,
		                           CERT_STORE_NAME                                      //MY
                                          )))
	{
		HandleError("Unable to open store MY.");
	}

	// Получаем указатель на наш сертификат

	if(pSignerCert = CertFindCertificateInStore(
		                     hStoreHandle,
		                     MY_TYPE,                             //(PKCS_7_ASN_ENCODING | X509_ASN_ENCODING)
		                     0,
		                     CERT_FIND_SUBJECT_STR,
		                     SIGNER_NAME,                     //Tom Soyer
		                     NULL))
	{
		printf("Cert found.\n");
	}
	else
	{
		HandleError("Cert not found.");
	}

	BYTE *pbSignedMessageBlob;
	DWORD cbSignedMessageBlob;

	CRYPT_SIGN_MESSAGE_PARA SigParams;
	ZeroMemory(&SigParams, sizeof(SigParams));

	SigParams.cbSize = sizeof(SigParams);
	SigParams.dwMsgEncodingType = MY_TYPE;
	SigParams.pSigningCert = pSignerCert;
	SigParams.HashAlgorithm.pszObjId = szOID_CPCSP_HASH_SIGN_EL_ALG;
	SigParams.HashAlgorithm.Parameters.cbData = NULL;
	SigParams.cMsgCert = 0;
	SigParams.rgpMsgCert = NULL;
	SigParams.cAuthAttr = 0;
	SigParams.dwInnerContentType = 0;
	SigParams.cMsgCrl = 0;
	SigParams.cUnauthAttr = 0;
	SigParams.dwFlags = 0;
	SigParams.pvHashAuxInfo = NULL;
	SigParams.rgAuthAttr = NULL;

	const BYTE* MessageArray[] = {pbMessage};
	DWORD MessageSizeArray[1];
	MessageSizeArray[0] = cbMessage;

	if(CryptSignMessage(
		&SigParams,
		TRUE,
		1,
		MessageArray,
		MessageSizeArray,
		NULL,
		&cbSignedMessageBlob))
	{
		printf("Sign size: %d.\n", cbSignedMessageBlob);
	}
	else
	{
		HandleError("CryptSignMessage Error.");
	}

	if(!(pbSignedMessageBlob = new BYTE[cbSignedMessageBlob + 1]))
	{
		HandleError("Error no memory.");
	}

	if(CryptSignMessage(
		&SigParams,
		TRUE,
		1,
		MessageArray,
		MessageSizeArray,
		pbSignedMessageBlob,
		&cbSignedMessageBlob))
	{
		//pbSignedMessageBlob[cbSignedMessageBlob] = '\0';
		/*ofstream file("c:\\path\\sign_pkcs7.txt", ios::out | ios::binary);
		file << pbSignedMessageBlob;
		file.close();*/
		//pbSignedMessageBlob[cbSignedMessageBlob] = '\0';

		FILE *file;
		file = fopen("c:\\path\\sign_pkcs7.sig", "wb");
		fwrite(pbSignedMessageBlob, sizeof(BYTE), cbSignedMessageBlob, file);
		fclose(file);
	}
	else
	{
		HandleError("Error signing.");
	}


Проверка:

Код:
PCCERT_CONTEXT pSignerCert = 0;

        char *pkcsContent;
	ifstream pkcsSign("c:\\path\\sign_pkcs7.sig", ios::in | ios::binary | ios::ate );
	ifstream::pos_type size3 = pkcsSign.tellg();
	pkcsContent = new char[size3];
	pkcsSign.seekg(0, ios::beg);
	pkcsSign.read(pkcsContent, size3);
	pkcsSign.close();	
	pkcsContent[size3] = '\0';

	cbArray = (DWORD)size3;
	pbArray = new BYTE[size3];
	pbArray = (BYTE *)pkcsContent;
	if ( !( hStoreHandle = CertOpenStore(
						CERT_STORE_PROV_SYSTEM,
						0,
						NULL,
						CERT_SYSTEM_STORE_CURRENT_USER,
						CERT_STORE_NAME                                   //MY
                                         )))
	{
		HandleError("Unable to open store MY.");
	}

	if(pSignerCert = CertFindCertificateInStore(
		                    hStoreHandle,
		                    MY_TYPE,                                //(PKCS_7_ASN_ENCODING | X509_ASN_ENCODING)
		                    0,
		                    CERT_FIND_SUBJECT_STR,
		                    SIGNER_NAME,                       //Tom Soyer
		                    NULL))
	{
		printf("Cert found.\n");
	}
	else
	{
		HandleError("Cert not found.");
	}

	CRYPT_VERIFY_MESSAGE_PARA VerifyParams;
	ZeroMemory(&VerifyParams, sizeof(VerifyParams));
	// Заполнение структуры для верификации

	VerifyParams.cbSize = sizeof(VerifyParams);
	VerifyParams.dwMsgAndCertEncodingType = MY_TYPE;
	VerifyParams.hCryptProv = 0;
	VerifyParams.pfnGetSignerCertificate = MyGetSignerCertificateCallback;
	VerifyParams.pvGetArg = (void*)pSignerCert;

	// верификация подписи
	if(CryptVerifyDetachedMessageSignature(
		&VerifyParams,          // указатель на структуру VerifyParams
		0,                             // 
		pbArray,		       // указатель на подпись
		cbArray,		       // длина подписи
		1,                            // число сообщений
		MessageArray,         // сообщение
		MessageSizeArray,   // длина сообщения
		&pSignerCert))	      // указатель на сертификат
	{
		printf("Verified successfully!.\n");
	}
	else
	{
		HandleError("Verification failed.");
	}



Цитата:
сертификат в ЭЦП ...

Хм...

Отредактировано пользователем 25 февраля 2012 г. 11:26:41(UTC)  | Причина: Не указана

Offline forik  
#7 Оставлено : 25 февраля 2012 г. 13:26:03(UTC)
forik

Статус: Активный участник

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

Сказал(а) «Спасибо»: 2 раз
Начал действовать по-другому: читать сертификат из файла, чтобы универсальнее было, но что-то не выходит:

Код:
#define MY_TYPE  (PKCS_7_ASN_ENCODING | X509_ASN_ENCODING)
#define CERT_STORE_NAME  L"MY"
#define SIGNER_NAME L"Tom Soyer"
#define CONTAINER L"c://users//timur//appdata//local//infotecs//containers//rnd-1-8D1E-4B06-0419-652D-4733-BAA7-3079"

HCERTSTORE hStoreHandle = 0;
PCCERT_CONTEXT pSignerCert = 0;

int main (int argc, char* argv[])
{
	char *fileContent;
	ifstream file("c:\\users\\timur\\desktop\\numonly.txt", ios::in | ios::binary | ios::ate);
	ifstream::pos_type size1 = file.tellg();
	fileContent = new char[size1];
	file.seekg(0, ios::beg);
	file.read(fileContent, size1);
	file.close();
	fileContent[size1] = '\0';

	BYTE *pbMessage = (BYTE*)fileContent;
	DWORD cbMessage = (DWORD)size1;

	PCCERT_CONTEXT pCert;

	BYTE *certContent;
	DWORD certSize;
	DWORD bytesRead;

	/*ifstream fCert ("c:\\users\\timur\\desktop\\certnew.cer", ios::in | ios::binary | ios::ate);
	ifstream::pos_type size2 = fCert.tellg();
	certContent = new BYTE[size2];
	fCert.seekg(0, ios::beg);
	fCert.read((char *)certContent, size2);
	fCert.close();
	certContent[size2] = '\0';*/

	HANDLE certFileHandle = NULL;
	certFileHandle = CreateFile(L"c:\\users\\timur\\desktop\\certnew.cer",
								GENERIC_READ,
								0,
								NULL,
								OPEN_EXISTING,
								FILE_ATTRIBUTE_NORMAL,
								NULL);
	certSize = GetFileSize(certFileHandle, NULL);
	certContent = new BYTE[certSize];
	ReadFile(certFileHandle,
			 certContent,
			 certSize,
			 &bytesRead,
			 NULL);
	certContent[certSize] = '\0';

	if(!(pCert = CertCreateCertificateContext(
										MY_TYPE,
										certContent,
										certSize)))
	{
		printf("CertCreateCertificateContext error %d\n", GetLastError());
	}


Файл считывается нормально, 1240 байт, но CertCreateCertificateContext не выполняется - валится ошибка -2146881269.

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

Offline Андрей Писарев  
#8 Оставлено : 25 февраля 2012 г. 14:56:20(UTC)
Андрей *

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

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

Сказал «Спасибо»: 618 раз
Поблагодарили: 2392 раз в 1881 постах
forik написал:
Офф :Прошу прощения ) Сам не люблю подобное, но иногда туплю )

SigParams.cMsgCert = 0;
SigParams.rgpMsgCert = NULL;


Цитата:
сертификат в ЭЦП ...

Хм...



вот здесь:
Код:


SigParams.cMsgCert = 1;
    SigParams.rgpMsgCert = &pSignerCert;

 

Отредактировано пользователем 25 февраля 2012 г. 15:06:49(UTC)  | Причина: Не указана

Техническую поддержку оказываем тут
Наша база знаний
Offline Андрей Писарев  
#9 Оставлено : 25 февраля 2012 г. 15:07:19(UTC)
Андрей *

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

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

Сказал «Спасибо»: 618 раз
Поблагодарили: 2392 раз в 1881 постах

открыть страшную тайну?


есть не только SDK\примеры от Инфотекса и КриптоПРО... и этот форум (+ старый) с поиском...

но и ... в MSDN Signing a Message and Verifying a Message Signature

Отредактировано пользователем 25 февраля 2012 г. 15:24:27(UTC)  | Причина: Не указана

Техническую поддержку оказываем тут
Наша база знаний
Offline Андрей Писарев  
#10 Оставлено : 25 февраля 2012 г. 15:27:19(UTC)
Андрей *

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

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

Сказал «Спасибо»: 618 раз
Поблагодарили: 2392 раз в 1881 постах
кстати, это по ТЗ такая схема реализуется?
(сертификат без установки в личное хранилище?)
Техническую поддержку оказываем тут
Наша база знаний
RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
Guest
3 Страницы123>
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.